Java实现考拉兹序列算法部分正整数输入输出负数问题求助
问题原因
你遇到的是Java int类型整数溢出问题:
- Java中
int是32位有符号整数,取值范围为-2^31到2^31-1(也就是-2147483648到2147483647) - 你输入的几个大数值在反复执行
奇数*3+1的运算过程中,结果会超出int的最大值限制,发生溢出后就会变成负数 - 负数不满足
while(n > 1)的循环条件,循环直接终止,最终输出错误的负数结果
修复方案
把所有参与运算的变量类型从int替换为取值范围更大的long(64位有符号整数,取值范围为-2^63到2^63-1,足够支撑考拉兹猜想的常规数值运算需求),还可以顺便调整输出分隔符和题目要求的>格式对齐,修正后的代码如下:
import java.util.*; public class practice { // 参数类型改为long public static void solve(long n){ while(n > 1){ System.out.print(n + " > "); if(n % 2 == 0){ n=n/2; }else{ n=(3*n)+1; } } System.out.print(n); } public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); // 读取输入后转成long类型 long input = keyboard.nextLong(); solve(input); } }
内容的提问来源于stack exchange,提问作者trashprogrammerD
相关产品推荐
相关产品推荐

