Разница в том, что ваше предыдущее условие первичности - i == j
- больше не выполняется.
Это верно именно тогда, когда вы проверили каждое число от 2 до i
, но с пределом sqrt(i)
вы выходите из цикла гораздо раньше.
Я думаю, что самое простое изменение - ввести переменную и переместить push_back
вне цикла (это работает с любым из условий цикла):
for (int i = 2; i <= num; i++) {
bool isPrime = true; // Assume 'i' is prime until proven wrong.
for (int j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
prime_numbers.push_back(i);
}
}
То есть сначала решите, имеет ли место что-то, затем сделайте что-нибудь с этой информацией.
Это полезный дизайн в очень многих случаях.
Например, гораздо проще перенести проверку простоты в функцию:
bool isPrime(int x) { /* something */ }
// ...
for (int i = 2; i <= num; i++) {
if (isPrime(i)) {
prime_numbers.push_back(i);
}
}