如何将含unsigned long long int的C递推代码转换为Java?
如何将C语言中的unsigned long long数组转换为Java实现?
问题描述
我需要把一段接收命令行整数参数、计算递推关系的C代码转换成Java语言,但不清楚如何改写其中的unsigned long long int gn[3]={0,0,1}, tmp;部分,求实现方案。
原C代码
#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("%ld\n",gn[n]); }else{ printf("%llu\n",gn[2]); } return 0; }
测试结果
- 输入:1,输出:0
- 输入:5,输出:4
- 输入:10,输出:81
- 输入:30,输出:15902591
解决方案
Java中没有和C语言unsigned long long完全对应的无符号64位整数类型,但可以用**long类型**替代:Java的long是64位有符号整数,取值范围是-9223372036854775808到9223372036854775807,你的测试用例中最大结果15902591远小于上限,完全可以满足需求。
对应原代码中数组和临时变量的改写方式:
- 数组:用
long[] gn = new long[]{0, 0, 1};直接初始化,和C语言的数组定义逻辑一致。 - 临时变量
tmp:定义为long tmp;即可。
以下是完整的Java实现代码:
public class RecursionCalculator { public static void main(String[] args) { long[] gn = new long[]{0, 0, 1}; long tmp; int i, j; int n = Integer.parseInt(args[0]); 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) { System.out.println(gn[n]); } else { System.out.println(gn[2]); } } }
说明
这段Java代码完全复刻了原C代码的递推逻辑:通过滚动数组保存前三项的值,迭代计算到第n项,最终输出对应结果。运行时只需在命令行传入整数参数即可,比如java RecursionCalculator 30就能得到15902591的输出。
内容的提问来源于stack exchange,提问作者satohh
相关产品推荐
相关产品推荐

