簡體   English   中英

搜索大素數時,整數常量對於“長整型”而言太大

[英]integer constant is too large for ‘long’ type when searching for large primes

我試圖找到介於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;
}

使用unsigned long long int i = 1000000000000LL代替long long int i = 1000000000000LL。

另外,您還必須將j也用作無符號long long int,因為i / 2可能不適合int j

似乎您想添加您提到的范圍內的所有素數。 我強烈建議您使用分段篩

或者您可以進行簡單的篩分。 采取大小為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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM