Как CoderCharmander указывает в комментариях , что continue
разрывается только от внутреннего l oop, но вы намеревались продолжить с наружный л oop. Наименьшее исправление заключается в использовании страшного goto
, вполне уместного здесь.
Также неверна внутренняя спецификация for
l oop:
#include <iostream>
int prime[30];
int main()
{
int i, j;
std::cout << 2 << " "; // the first prime is 2
for (i=3; i < 30; i+=2)
{
for // all wrong: (j =i; j>i*i; j--)
(j = 2; j*j <= i; ++j) // or even, (j = 3; j*j <= i; j += 2)
{
if ((i % j) == 0)
{
prime[i] = 0; // initialize the non-primes as well!
goto L1; // continue the outer loop
}
}
// the inner loop finished normally
prime[i] = i;
std::cout << i << " ";
L1: ;
}
}
Это также без необходимости проверяет числа на все числа выше 2, меньшие, чем пороговое значение (или шансы, как в прокомментированном предложении), но нам действительно нужно проверять только простые числа.
При внесении этой поправки важно быть осторожным, чтобы не вводить гораздо большую неэффективность, чем та, которую мы пытались исправить ( квадратик c потеря во временной сложности по сравнению с намеченным log коэффициент усиления), так как нет смысла проверять делимость, например, на 23 на 5,7,11,13 и 19.
А на самом деле проверяемую делимость можно вообще избежать если кто-то так решит, но это совсем другое дело.