问题描述
解决问题时遇到一点问题:“计算200万以下的素数之和”。我正在使用“ Eratosthenes筛网”方法。我的方法可以找到直到100的素数,但当我尝试找到直到2,000,000的素数的总和时,我得到了错误的答案。
#include <iostream>
using namespace std;
long long unsigned int number[2000008];
int x=2000000LLU;
int sum()
{
int s=0LLU; //stores sum
for(int y=2; y<=x; y++) //add all the numers in the array from 2 to 2 million
{
s+=number[y];
}
return s;
}
int main()
{
int k=2;
for(int i=2; i<=x; i++) //fills in numbers from 2 to 2 million in the array
{
number[i]=i;
}
for(int j=2; j<=x; j+=1) //starts eliminating multiples of prime numbers from the grid
{
if(number[j]!=0) //moves through the grid till it finds a number that hasnt been crossed out. ie. isnt zero
{
for(int y=j+j; y<=x; y+=j) //when it finds a number,it removes all subsequent multiples of it
{
number[y]=0;
}
}
}
cout<<endl<<\"done\"; //shows that the loop has been completed
cout<<sum(); //outputs the sum of the grid
return 0;
}
解决方法
我不确定int是否足以容纳答案...它可能大于32位值。
尝试全部使用
long long
。
, 通过有效地使用Eratosthenes筛,我解决了这个问题,这是我的代码,它是高度优化的
public class SumOfPrime {
static void findSum()
{
long i=3;
long sum=0;
int count=0;
boolean[] array = new boolean[2000000];
for(long j=0;j<array.length;j++)
{
if((j&1)==0)
array[(int)j]=false;
else
array[(int)j]=true;
}
array[1]=false;
array[2]=true;
for(;i<2000000;i+=2)
{
if(array[(int)i] & isPrime(i))
{
array[(int)i]=true;
//Sieve of Eratosthenes
for(long j=i+i;j<array.length;j+=i)
array[(int)j]=false;
}
}
for(int j=0;j<array.length;j++)
{
if(array[j])
{
//System.out.println(j);
count++;
sum+=j;
}
}
System.out.println(\"Sum=\"+sum +\" Count=\"+count);
}
public static boolean isPrime(long num)
{
boolean flag=false;
long i=3;
long limit=(long)Math.sqrt(num);
for(;i<limit && !(flag);i+=2)
{
if(num%i==0)
{
flag=false;
break;
}
}
if(i>=limit)
flag=true;
return flag;
}
public static void main(String args[])
{
long start=System.currentTimeMillis();
findSum();
long end=System.currentTimeMillis();
System.out.println(\"Time for execution=\"+(end-start)+\"ms\");
}
}
输出是
Sum=142913828922 Count=148933
Time for execution=2360ms
如有疑问,请告诉