【发布时间】:2013-09-27 14:06:48
【问题描述】:
我正在尝试用 java 进行一些数学运算,如果它(非)偶数,它确实会测试一个数字,并且只要它达到 1 就会改变它。
我尝试运行循环 999999 次,它似乎卡在了大约 120000 次左右。好吧,它并没有因为异常而停止,只是感觉编译器卡住了。
我对 Java 不太擅长,谁能解释一下这里发生了什么?
public static void main(String[] args) {
int n = 0;
int highestNumber = 0;
int highestCounter = 0;
int counter = 0;
for (int i = 2;i<1000000;i++) {
if (i%10000==0) {
System.out.println(i);
}
n = i;
while (n!=1) {
if (n%2==0) {
n = n/2;
} else {
n=3*n+1;
}
counter++;
}
if (counter>highestCounter) {
highestCounter = counter;
highestNumber = i;
System.out.println("HIGHEST "+highestNumber+" | counter = "+counter);
}
counter = 0;
n = 0;
}
System.out.println("final "+highestNumber);
}
【问题讨论】:
-
只是拖钓:
for (int i = 2;i<1000000;i++) {将执行 999998 次... -
变量
counter和highestCounter在哪里初始化? -
嗨。要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,那么您就发现了您的问题。 (然后如果有必要,你应该构造一个minimal test-case。)
-
编译器不会卡住,因为你可以运行代码
-
也许你已经找到了科拉茨猜想的第一个反例! ;)