![](/img/trans.png)
[英]gcc 4.1.2: error: integer constant is too large for ‘long’ type
[英]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,我會得到:
#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.