Это проблема на spoj.com (http://www.spoj.com/problems/PRIC/). Мы должны проверить, являются ли числа последовательности: ai = (a (i-1) +1234567890) mod 2 ^ 31 простыми или нет, 1-е число равно 1.
Мой код приведен ниже (пожалуйста, постарайтесь не обращать внимания на неуклюжесть) на основе сита из эратосфена.
ПРОБЛЕМА: Мы должны напечатать «простое (1) или нет (0)» для последовательности до i = 33,333,333, мой код прекрасно работает для значений i (c3 в коде) до 8000 или около того и после этого (например, c3> 19000) начинает выдавать ошибку SIGFPE. Теперь я погуглил об ошибке, это связано с делением / модом на 0. Но почему этот код работает для значений c3 до 9000, но не более того?
В зависимости от вашего компилятора и среды разработки вам следует ознакомиться с концепцией отладчика. Этот ответ есть руководство по использованию gdb
, Если вы используете Visual Studio, Code :: Blocks или любую другую 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 в документе, который я получил, когда я скопировал ваш код из Stackoverflow, может не совпадать со строкой 43 в вашем документе.
EDIT2:
Эй, мой ответ не был принят! — почему это было :)?