我正在使用 java解决 Project Euler问题 14 。我不是在寻求帮助解决问题。我已经解决了它,但我遇到了一些我无法弄清楚的事情。
问题是这样的:
为正整数集定义了以下迭代序列:
n = n/2,如果 n 是偶数
n = 3n + 1,如果 n 是奇数使用上面的规则并从 13 开始,我们生成以下序列:
13 -> 40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1。这里,链的长度是 10 个数字。
找到低于 1,000,000 的起始数字,它会产生最长的链。
所以我写了这段代码:
public class Euler014 {
public static void main(String[] args){
int maxChainCount = 0;
int answer = 0;
int n;
int chainCount = 1;
for(int i = 0; i < 1000000; i++){
n = i;
while(n > 1){
if(n%2 == 0){ //check if even
n /= 2;
}else{ //else: odd
n = 3*n + 1;
}
chainCount++;
}
if(chainCount > maxChainCount){ //check if it's the longest chain so far
maxChainCount = chainCount;
answer = i;
}
chainCount = 1;
}
System.out.println("\n\nLongest chain: i = " + answer);
}
}
这给了我答案 910107,这是错误的。
但是,如果我将我的 n 变量的类型更改为double n
它运行并给我答案 837799,这是正确的!
这真的让我很困惑,因为我根本看不出有什么区别。我知道,如果我们使用int
并进行除法运算,我们最终可能会在我们不打算这样做时对数字进行舍入。但是在这种情况下,我们总是n
在除以 2 之前检查是否可以被 2 整除。所以我认为使用整数是完全安全的。我没看到什么?
这是完整的代码,如果您想亲自查看,请复制、粘贴并运行它。尽管有很多迭代,但它会在几秒钟内运行。=)