Это будет переполнено 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
, конечно).