0

这是 spoj.com ( http://www.spoj.com/problems/PRIC/ ) 上的一个问题。我们必须检查序列的数字是否:ai=( a(i-1)+1234567890 ) mod 2^ 31 是否为素数,第一个数字是 1。下面给出了我的代码(请尽量忽略笨拙。)基于 eratosthenes 的筛子。

问题:我们必须为 i=33,333,333 的序列打印“素数(1)或非(0)”,我的代码对于 i(代码中的 c3)值高达 8000 左右以及之后(例如 c3> 19000) 它开始给出 SIGFPE 错误。现在我用谷歌搜索了这个错误,它与除法/模减 0 有关。但是为什么该代码适用于高达 9000 的 c3 值但不能超过此值?

4

1 回答 1

6

根据您的编译器和开发环境,您应该阅读调试器的概念。这个答案有一个使用指南gdb。如果您使用的是 Visual Studio、Code::Blocks 或任何其他 IDE,请查看调试功能。例如如何设置断点或步入/退出/跳过函数调用,例如观察或更改变量等。(我提到这些事情是为了给你谷歌搜索词的重要提示,眨眼眨眼轻推) .

编辑

复制粘贴代码并保存它,用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 语句。这似乎是你做模零的地方。

请注意,当我从 Stackoverflow 复制粘贴您的代码时,我得到的文档中的第 43 行可能不是您文档中的第 43 行。

编辑2

嘿,我的回答不被接受!- 那是为什么:)?

于 2014-05-28T18:31:03.090 回答