#c #sieve-of-eratosthenes
#c #сито эратосфена
Вопрос:
Возникли небольшие проблемы с решением задачи: «Вычислите сумму простых чисел меньше двух миллионов». Я использую метод «Сита Эратосфена». Мой метод отлично работает для нахождения простых чисел до ста, но когда я пытаюсь найти сумму простых чисел до 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;
}
Ответ №1:
Я не уверен, что int достаточно для хранения ответа… Это может быть больше 32-разрядного значения. Попробуйте использовать long long
повсюду.
Комментарии:
1. Этого было достаточно, чтобы сохранить решение для меня.
2. @aligray: Это зависит от размера вашего
int
, который зависит от платформы. То же самое касаетсяlong
, тогда какlong long
должно быть способно содержать не менее 64 бит на любой платформе. Ответом является 38-битное значение.3. @omrib Упс, хотел сказать,
long long
было достаточно.4. я получаю ответ: 1179908154 фактический ответ: 142913828922
5. @viraj: уверен, что это ответ после изменения «int» на «long long» для сохранения суммы, как было предложено? Вы пробовали это?
Ответ №2:
эффективно используя решету Эратосфена, я решил проблему, вот мой код, он высоко оптимизирован
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((jamp;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] amp; 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 amp;amp; !(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
если у вас есть сомнения, пожалуйста, скажите