так что это в основном просто два опечатки , один из них - самый неудачный, for (int j = 2; j <= num; j++)
, что является причиной непродуктивного тестирования 1%2,1%3 ... 1%(10^15-1)
, которое продолжается очень долго, поэтому ОП "любой вывод" . Вместо этого должно было быть j < i;
. Другое, второстепенное по сравнению, то, что i
должно начинаться с 2, а не с 0:
for( i=2; i <= num; i++ )
{
for( j=2; j < i; j++ ) // j <= sqrt(i) is really enough
....
Конечно, нельзя ожидать, что распечатка консоли из 28 триллионов простых чисел или около того будет завершена в любой разумный срок. Таким образом, первоначальная цель этой проблемы, очевидно, заключалась в том, чтобы распечатать непрерывный поток простых чисел до бесконечности . Следовательно, все решения, предлагающие простое использование сита Эратосфена, здесь совершенно бесполезны, поскольку простое сито Эратосфена ограничено - предел должен быть установлен заранее.
Что может сработать здесь, так это оптимизированное пробное деление, которое сохранит простые числа при их обнаружении и будет проверять не простые числа, а только все числа ниже кандидата.
Вторая альтернатива, с гораздо большей сложностью (то есть намного быстрее), состоит в использовании сегментированного сита из Эратосфена . Который является инкрементным и неограниченным.
Обе эти схемы будут использовать двухэтапное производство простых чисел : один будет производить и сохранять простые числа, которые будут использоваться на другом этапе тестирования (или просеивания), намного выше предела первого этап (конечно, ниже его квадрата - автоматически расширяется первый этап, так как второй этап будет идти все дальше и дальше вверх).