【问题标题】:integer constant is too large for ‘long’ type when searching for large primes搜索大素数时,整数常量对于“long”类型来说太大了
【发布时间】:2014-06-02 09:26:44
【问题描述】:

我试图找到介于 1,000,000,000,000 和 1,000,000,100,000 之间的素数。如果位数是 4 到 8,我的代码是可以的,但是如果位数大于或等于 12,我会得到:

  1. 警告:整数常量对于“long”类型来说太大
  2. 浮点异常
#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;
}

【问题讨论】:

  • long long int i=1000000000000替换为long long int i=1000000000000LL,将#define num 1000000100000替换为#define num 1000000100000LL,将for(int j=2; j&lt;=i/2; j++)替换为for(long long int j=2; j&lt;=i/2; j++)
  • ...除非您有充分的理由,否则它们也应该是未签名的。
  • 只是出于好奇,运行这个循环需要多长时间?
  • @40two 应该是关于 pow(10,17) 操作的。超过 3.17 年是我的粗略猜测。
  • @WhozCraig 他这样做有充分的理由:它们是数值。

标签: c++ algorithm primes


【解决方案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;
}

【讨论】:

    【解决方案2】:

    使用 unsigned long long int i=1000000000000LL 而不是 long long int i=1000000000000LL。

    您还必须将 j 也用作 unsigned long long int,因为 i/2 可能不适合 int j

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多