先附上自己写的代码
#include <iostream>
#include <math.h>using namespace std;
const static int MAX_LEN=10001;
bool boolPrimes[MAX_LEN];
void findPrime();
int main()
{
int Primes[1229],j=0;
int sum=0,count=0;
int num;
findPrime();
for(int i=0;i<1229;i++){
if(boolPrimes[i]==true)
{Primes[j]=i;j++;}
}
cin>>num;
while(num!=0){
count=0;
if(num==2)
count=1;
else{
for(int i=2;i<=1299;i++){
for(int j=i;sum<=1299;j++){
sum+=Primes[j];
if(sum==num)
{count+=1;
break;}
else if(sum>num)
break;
}
}
}
cout<<count<<endl;
}
return 0;
}
void findPrime()
{
for(int m=0;m<MAX_LEN;m++)
boolPrimes[m]=true;
for(int i=2;i<MAX_LEN;i++){
for(int j=i;j<int(sqrt((double)i));j++)
if(i%j==0)
{boolPrimes[i]=false;break;}
}
}
流程是先将1-10000的数创建一个数组,然后分别判断每个数是否为质数,若是则置为true
然后将是true的位置的下标放在Primes这个数组里
最后计算结果
但是放在oj里总是超时。
再附一个正确的代码
#include<stdlib.h> #include<stdio.h> #include<math.h> bool isPrime(int num){ int m; if(num==2) return true; //注意,搜索是否可以被整除的范围只在小于根号num内即可 //不会有比根号num更大的约数,另外,一旦发现可以被整除 //立即跳出循环,这样可以大幅度减少时间消耗,要不然会超时 for(m=2;m<(int)sqrt((double)num);m++){ if(num%m==0) break; } if(num%m==0) return false; else return true; } int main(){ int prime[1229],i,j=0,len=1229,in,out,sum; //计算10000以内的所有素数 for(i=2;i<10000;i++){ if(isPrime(i)) prime[j++]=i; } while(true){ out=0; scanf("%d",&in); if(in==0) break; for(i=0;i<len;i++){ sum=0; for(j=i;j<len;j++){ sum+=prime[j]; if(sum>in) break; else if(sum==in){ out++; break; } } } printf("%d\n",out); } return 0; }想了下原因,大概就是我的程序里,在筛选质数的时候是两步,先判断是否是质数再将其放入数组,而每次都遍历了1-10000,所以很耗时。