这是一个关于spoj.com(http://www.spoj.com/problems/PRIC/)的问题。我们必须检查序列号:ai =(a(i-1)+1234567890)mod 2 ^ 31是否为素数,第一个数字是1。 我的代码在下面给出(请尽量忽略笨拙。)基于eratosthenes的筛子。
问题:我们必须打印" prime(1)或不是(0)"对于序列高达i = 33,333,333,我的代码完全适用于i(代码中的c3)值高达8000左右,之后(例如c3> 19000)它开始给出SIGFPE错误。现在我用谷歌搜索了错误,它与除法/ mod有关。但是为什么代码适用于c3值高达9000但不超过?
答案 0 :(得分:5)
根据您的编译器和开发环境,您应该阅读调试器的概念。 This answer有使用gdb
的指南。如果您使用的是Visual Studio,Code :: Blocks或任何其他IDE,请查找调试功能。例如,如何在函数调用中设置断点或步进/移出/例如,观察或更改变量等(我提到这些东西,为您提供Google搜索词的重要提示,wink wink nudge nudge)
修改强>:
复制粘贴代码并保存,用gcc -g
编译用于调试符号,-lm
用于链接数学库,我通过gdb
运行它,它给了我输出:
Program received signal SIGFPE, Arithmetic exception.
0x0000000000400707 in sieve (prime=0x6626a0) at t.c:43
43 if (a%prime2[j]==0){
这告诉您在使用模运算的if语句中查看第43行。这似乎是你正在做模零的地方。
请注意,当我从Stackoverflow复制粘贴代码时,我获得的文档中的第43行可能不是文档中的第43行。
<强> EDIT2 强>:
嘿,我的回答是不可接受的! - 那是为什么:)?