【发布时间】:2016-02-09 21:18:47
【问题描述】:
我正在尝试解决problem #14 from Project Euler,并编写了以下C#...
int maxColl = 0;
int maxLen = 0;
for (int i = 2; i < 1000000; i++) {
int coll = i;
int len = 1;
while (coll != 1) {
if (coll % 2 == 0) {
coll = coll / 2;
} else {
coll = 3 * coll + 1;
}
len++;
}
if (len > maxLen) {
maxLen = len;
maxColl = i;
}
}
麻烦的是,它只是跑了又跑,似乎没有停止。
在搜索了其他人的解决方案后,我看到一个看起来非常相似,只是他使用了 long 而不是 int。我不明白为什么这是必要的,因为这个问题中涉及的所有数字都在 int 的范围内,但我还是尝试了。
将 int 更改为 long 使代码在 2 秒内运行。
谁能给我解释一下?
【问题讨论】:
-
只是从 int 更改为 long 不应该有那么大的差异。我怀疑你有一个溢出来阻止 while 循环中断。在调试器中观察它,看看你是否无法确定某处是否存在溢出。
-
通常 Int64 比 Int32 慢。您可能在这里进行了溢出处理,导致 Int32 变慢。
-
@Ben 它通常同样快,除了除法和一些复杂的操作。在某些以 32 位值运行的系统上甚至更慢,因为您需要符号/零扩展和掩码才能转换为 64 位值
标签: c#