这是spoj.com (http://www.spoj.com/problems/PRIC/) .We上的一个问题,它必须检查序列的数字: ai=( a(i-1)+1234567890 ) mod 2^31是否素数,第一个数字是1。下面给出了我的代码(请忽略它的笨拙。)以伊拉托斯提尼的筛子为基础。
问题是:我们必须为序列上的i=33,333,333打印“素数(1)或不(0)”,我的代码对于i(代码中的c3 )值可以很好地工作到8000左右,然后(例如c3>19000 )就开始给出SIGFPE错误。现在我在googled上搜索了这个错误,它与除法/ mod 0有关。但是,为什么代码对高达9000的c3值起作用,而不超过它呢?
发布于 2014-05-28 18:31:03
根据编译器和开发环境的不同,您应该了解调试器的概念。This answer有一个使用gdb的指南。如果使用的是Visual、Code::Block或任何其他IDE,请查找调试功能。例如,如何设置断点或进入/退出/结束函数调用--例如,监视或更改变量等等(我提到这些东西是为了给您提供Google搜索的重要提示--单词、眨眼提示提示)。
编辑
复制粘贴代码并保存它,用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){这将告诉您查看第43行,即使用模块化操作的if语句。这似乎是你正在做模零的地方。
请注意,当我从堆栈溢出复制粘贴您的代码时,文档中的第43行可能不是您文档中的第43行。
EDIT2
嘿,我的答案不被接受!-为什么:)?
https://stackoverflow.com/questions/23918999
复制相似问题