这是一个用C编写的代码。它接收一个整数作为命令行参数,并计算递归关系。
我想把这段代码转换成Java,但不知道如何重写下面的部分。有人知道我怎么用Java写吗?
unsigned long long int gn[3]={0,0,1},tmp;
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
unsigned long long int gn[3]={0,0,1}, tmp;
int i, j;
int n = atoi(argv[1]);
for(i=3; i<=n; i++){
tmp = 0;
for(j=0; j<3; j++){
tmp += gn[j];
}
gn[0] = gn[1];
gn[1] = gn[2];
gn[2] = tmp;
}
if(n<2){
printf("%ldn",gn[n]);
}else{
printf("%llun",gn[2]);
}
return 0;
}
结果
输入:1,输出:0
输入:5,输出:4
输入:10,输出:81
输入:30,输出:15902591
用BigInteger
重写这看起来微不足道。注意,C++中的argv[0]
是程序名称。Java没有遵循这个约定。所以它可能看起来像
BigInteger[] gn = { BigInteger.ZERO, BigInteger.ZERO, BigInteger.ONE };
int n = Integer.parseInt(args[0]);
for (int i = 3; i <= n; i++) {
BigInteger tmp = BigInteger.ZERO;
for (int j = 0; j < 3; j++) {
tmp = tmp.add(gn[j]);
}
gn[0] = gn[1];
gn[1] = gn[2];
gn[2] = tmp;
}
System.out.println(gn[Math.min(n, 2)]);
启动Java 8时,支持无符号长(无符号64位(。你可以使用它的方式是:
Long l1 = Long.parseUnsignedLong("17916881237904312345");
要打印它,你不能简单地打印l1,但你必须首先:
String l1Str = Long.toUnsignedString(l1)
然后System.out.println(l1Str);
如果你使用的Java版本低于Java 8,那么你应该使用BigInteger