请考虑此C代码
void main() {
int i, s = 17;
for (i = 8; i < 2000000; i++) {
if (ifprime(i))
s += i;
}
printf("%d", s);
}
它不会以这种迭代次数运行,但是会以较低的迭代次数(例如while (i < 200000)
那是为什么?
(请注意,我并不是在寻求解决方案,非常感谢)
答案 0 :(得分:2)
这将溢出32位整数。这是未定义的行为,尽管通常不会导致程序无休止地运行,但这是有可能的,因为无法保证程序表现出未定义的行为时会发生什么。尝试使用long long
,它至少为64位(对于有符号版本,至少为63位和一个符号位)。
long long s = 17;
并以这种方式打印:
printf("%lld", s);
此素数搜索的未优化版本将花费相当长的时间,直到2000000
为止的所有数字,因此,也许您只是认为它在不运行时会无休止地运行。我建议通过将if (i % 1000 == 0) printf("%d %lld\n", i, s);
之类的打印内容放入循环中进行调试,然后您可以查看打印的距离以及它是否仍在工作。对我来说,它正在工作(当然有long long
修复程序。)
答案 1 :(得分:1)
因为您知道这将是积极的,所以您可以使用
unsigned long long s = 17;
然后使用
打印printf("%llu",s);
您也可以将其用于i