我想找到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;
}
答案 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;
}