0
Число простых чисел менее 10 000 000 составляет 664 579, но мой код генерирует только 664,214. Источник чисел https://primes.utm.edu/howmany.htmlПочему мой код не генерирует простые числа правильно
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
const int N = 10000001;
bitset<N>num;
vector<int>prime;
inline void sieve()
{
num.flip();
num[0] = num[1] = 0;
for(int i=2;i<N;i++)
if(num[i])
{
prime.push_back(i);
for(long long unsigned j=i*i; j<N;j+=i)
num[j] = 0;
}
}
int main() {
sieve();
cout << prime.size() << endl;
return 0;
}
И если инициализация 'j' изменяется на' у = (неподписанных долго долго) я * i', правильный выход также печатается. – hvd
И если предел для внешнего цикла был установлен правильно (до sqrt (N)), то умножение никогда не может переполняться в первую очередь. Это не только должная осмотрительность, но и сокращение количества итераций для внешнего цикла до доли. Примечание: в зависимости от режима округления 'sqrt()' может округлять, а не вниз; лучше написать небольшую функцию 'max_factor()', которая заботится о деталях gory и которая может быть протестирована отдельно. – DarthGizka
Для ситового кода в общем случае количество граничных случаев значительно уменьшается, если используются правильные типы данных (unsigned int) и даже более того, если используются упакованные (только для коэффициентов) растровые изображения, поскольку он покупает дополнительный бит головной комнаты в индексе переменные. Излишне бросать двойные целые числа в проблему не стратегия, которая может привести к хорошему и надежному коду; кроме поощрения интеллектуальной лености, он также стремится сделать код беспорядочным, а не лучше. – DarthGizka