2014-11-04 2 views
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; 
} 

ответ

4

Вы целочисленное переполнение при вычислении i*i. Тот факт, что вы затем назначаете результат на долгое время, не заставляет компилятор продвигать типы до умножения.

Если я объявляю i как long long unsigned int то программа выводит 664579

+1

И если инициализация 'j' изменяется на' у = (неподписанных долго долго) я * i', правильный выход также печатается. – hvd

+0

И если предел для внешнего цикла был установлен правильно (до sqrt (N)), то умножение никогда не может переполняться в первую очередь. Это не только должная осмотрительность, но и сокращение количества итераций для внешнего цикла до доли. Примечание: в зависимости от режима округления 'sqrt()' может округлять, а не вниз; лучше написать небольшую функцию 'max_factor()', которая заботится о деталях gory и которая может быть протестирована отдельно. – DarthGizka

+0

Для ситового кода в общем случае количество граничных случаев значительно уменьшается, если используются правильные типы данных (unsigned int) и даже более того, если используются упакованные (только для коэффициентов) растровые изображения, поскольку он покупает дополнительный бит головной комнаты в индексе переменные. Излишне бросать двойные целые числа в проблему не стратегия, которая может привести к хорошему и надежному коду; кроме поощрения интеллектуальной лености, он также стремится сделать код беспорядочным, а не лучше. – DarthGizka

Смежные вопросы