c-如何转换";unsigned long long int";转换为Java



这是一个用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

最新更新