我觉得这题的数据应该有些刁钻,一共至少提交了五次,一直是WA,无语了。。。。。。用一个result数组存素数硬是不对。后来就算了,改用直接判断(法二),继续WA,后来发现是MAXN至少应为10002(被数据坑了),终于A掉了。。。。。。
后来继续改法一多次,任然WA,一直不清楚原因。
继续思考发现有一个很隐蔽的问题就是我后来用到 if(result[i]>n) break; 而result数组中 10000以内 最后一个素数是 9997,后面全是0了。这样无法停止,所以必须加一个大数作为哨兵。后来一试,果然AC了!
法二:(AC的代码)
#include <stdio.h> #define MAXN 10002 int prime[MAXN]; //用筛法求素数,0代表素数 int main() { //先打出素数表 prime[0]=prime[1]=1; //开始去掉[0]和[1] int i,j; for(i=2;i<MAXN;i++) { if(prime[i]==0) //如果prime[i]是素数就把他的倍数都筛掉 { for(j=2*i;j<MAXN;j+=i) prime[j]=1; } } int n,sum,count; while(scanf("%d",&n)) { if(n==0) break; count=0; //count做最后输出的 所有表示个数 for(i=0; ;i++) // i 控制素数串第一个数 { if(prime[i]!=0) continue; if(i>n) break; sum=0; //sum存 连续素数和 for(j=i; ;j++) { if(prime[j]!=0) continue; if(sum>n) break; sum=sum+j; if(sum==n) { count++; break; } } } printf("%d\n",count); } return 0; }
#include <stdio.h> #define MAXN 10002 int prime[MAXN]; //用筛法求素数,0代表素数 int result[1300]; int main() { //先打出素数表 prime[0]=prime[1]=1; //开始去掉prime[0]和prime[1] int i,j; for(i=2;i<MAXN;i++) { if(prime[i]==0) //如果prime[i]是素数就把他的倍数都筛掉 { for(j=2*i;j<MAXN;j+=i) prime[j]=1; } } int count=0; for(i=2;i<MAXN;i++) if(prime[i]==0) { result[count]=i; count++; } //test:估算素数个数 /*for(i=0;result[i]!=0;i++) { printf("%d ",result[i]); } printf("\n1W以内有 %d 个是素数\n",count);*/ int n,sum; while(scanf("%d",&n)) { if(n==0) break; count=0; //count做最后输出的 所有表示个数 for(i=0; ;i++) { if(result[i]>n) break; sum=0; //sum存 连续素数和 for(j=i; ;j++) { if(sum>n) break; sum=sum+result[j]; if(sum==n) { count++; break; } } } printf("%d\n",count); } return 0; }
法一(AC的代码)
#include <stdio.h> #define MAXN 10002 int prime[MAXN]; //用筛法求素数,0代表素数 int result[1300]; int main() { //先打出素数表 prime[0]=prime[1]=1; //开始去掉prime[0]和prime[1] int i,j; for(i=2;i<MAXN;i++) { if(prime[i]==0) //如果prime[i]是素数就把他的倍数都筛掉 { for(j=2*i;j<MAXN;j+=i) prime[j]=1; } } int count=0; for(i=2;i<MAXN;i++) if(prime[i]==0) { result[count]=i; count++; } result[count]=99999; //哨兵,因为result最后一个是9997,后面没有了 //test:估算素数个数 /*for(i=0;result[i]!=0;i++) { printf("%d ",result[i]); } printf("\n1W以内有 %d 个是素数\n",count);*/ int n,sum; while(scanf("%d",&n)) { if(n==0) break; count=0; //count做最后输出的 所有表示个数 for(i=0; ;i++) { if(result[i]>n) break; sum=0; //sum存 连续素数和 for(j=i; ;j++) { if(sum>n) break; sum=sum+result[j]; if(sum==n) { count++; break; } } } printf("%d\n",count); } return 0; }