About me:
女。某211软件工程大二生。打算从刷水题开始练手感以备战蓝桥杯省赛。代码渣渣一枚orz。欢迎路过的各位大神拍砖!!
本题题意:
输入一个2到10000之间的数(结束时以0结尾),输出这个数可以是多少组连续的素数之和。如17=2+3+5+7、41=11+13+17=2+3+5+7+11+13、2=2。
思路:
疯狂枚举orz。从2开始,判断2+3+5+7+......是否等于输入的数。若素数之和大于该数,则从下一个素数开始(如3)继续疯狂累加。若找到一组,则count++。最后输出count。
心得:
1.判断某数x是否为素数时,其约数控制在大于等于2小于根号x即可,节约运算时间。(Time Limit Exceeded的教训orz)
#include <iostream>
#include<string>
#include<math.h>
using namespace std;
int GetPrimeNumber(int x)
{
int i;
int ok=x;
for(i=2;i<=(int)sqrt((double)x);i++)
{
if(x%i==0)
{
ok=0;
break;
}
}
return ok;
}
int main(int argc, const char * argv[]) {
int n;
int sum=0,count=0;
int i=2;
int start=2;
while(cin>>n&&n)
{
for(;i<=n;i++)
{
if(GetPrimeNumber(i))
sum+=GetPrimeNumber(i);
if(sum==n)
{
count++;
start++;
while(!GetPrimeNumber(start))
{
start++;
}
i=start-1;
sum=0;
}
if(sum>n)
{
start++;
while(!GetPrimeNumber(start))
{
start++;
}
i=start-1;
sum=0;
}
}
cout<<count<<endl;
sum=0;
count=0;
start=2;
i=2;
}
return 0;
}
欢迎各路大神拍砖!!