我正在尝试解决一个问题,即找到2百万以上的素数并总结它们并将总和显示为我的输出(有关更多信息,请参阅https://projecteuler.net/problem=10)。我写了这段代码
#include<iostream>
using namespace std;
int main()
{
int last_range;
int not_prime_counter=0;
int sum=0;
int prime_number_counter=0;
cout<<"Enter range from 2 to ";
cin>>last_range;
int input=2;
/*
if(input==1)
{
cout<<input<<" is Prime\n";
sum=sum+input;
input++;
}
*/
if(input==2)
{
cout<<input<<" Prime\n";
sum=sum+input;
cout<<"Sum : "<<sum<<endl;
input++;
prime_number_counter++;
}
if(input==3)
{
cout<<input<<" Prime\n";
sum=sum+input;
cout<<"Sum : "<<sum<<endl;
input++;
prime_number_counter++;
}
if(input>3)
{
for(int i=2;i<=(input/2);i++)
{
if(input==last_range)
{
break;
}
if(input%i==0)
{
//cout<<input<<" is NOT Prime\n";
input++;
i=2;
}
if(i==(input/2) && not_prime_counter==0)
{
cout<<input<<" Prime\n";
sum=sum+input;
cout<<"Sum : "<<sum<<endl;
input++;
i=2;
}
}
}
cout<<"Final Sum : "<<sum<<endl;
system("pause");
return 0;
}
它适用于100,200,但当输入为2000000时,它会永远运行。我想知道为什么会这样,我的问题的解决方案是什么?我想使用单循环。
答案 0 :(得分:2)
对于大输入,您的算法太慢了。要确定数字是否为素数,您只需要检查它的平方根。
干净而快速地检查数字是否为素数是:
bool prime(int n) {
if (n == 1) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (i = 3; i*i <= n; i += 2)
if (n % i == 0) return false;
return true;
}