搜索大素数时,整数常量对于“long”类型来说太大了

时间:2014-06-02 09:26:44

标签: c++ algorithm primes

我想找到1,000,000,000,000到1,000,000,100,000之间的素数。如果位数为4到8,我的代码就可以,但如果数字大于或等于12,我得到:

  1. 警告:对于'long'类型,整数常量太大
  2. 浮点异常
  3. #include <iostream>
    #define num 1000000100000
    using namespace std;
    
    int main()
    {
      bool prime;
      long double sum = 0;
      for (long long int i=1000000000000; i<=num; i++)
      {
        prime = true;
        for(int j=2; j<=i/2; j++)
        {
          if(i%j == 0) prime = false;
        }
         if(prime) sum+=i;
      }
      cout<<sum<<endl;
    }
    

2 个答案:

答案 0 :(得分:1)

使用无符号long long int i = 1000000000000LL而不是long long int i = 1000000000000LL。

此外,您还必须使用 j 作为无符号long long int,因为 i / 2 可能不适合 int j

答案 1 :(得分:1)

您似乎想要在您提到的范围内添加所有素数。 我强烈建议segmented sieve为你的目的。

或者你可以做一个简单的筛选。取一个大小为100001的数组来存储100000000000 + i是否为素数。 (如果你可以使用100001 / 2位更好)只存储奇数100000000001 + 2 * i并筛选范围3 to 1000001中的所有奇数倍,并添加剩余的数字。

但是如果你想坚持你的方法,我会提出一些建议,让它在一些实际的时间运行。

#include <iostream>
#define num 1000000100000LL  // make long long
using namespace std;

int main()
{
  bool prime;
  long double sum = 0;
  for (long long int i=1000000000001LL; i<=num; i += 2LL)  // Make long long, loop through only odd numbers as even numbers are not prime except 2
  {
    prime = true;
    for(int j=3; j<=1000001; j += 2) // Loop until sqrt(i) only, loop through odd numbers only
    {
      if(i%j == 0) {
        prime = false;
        break;
      }
    }
     if(prime) {
        cout << i << endl;
        sum+=i;
     }
  }
  cout<<sum<<endl;
}