标签:比较 数加 view 生成 int ima scan void oid
这道题中由于素数的范围只有10000(比较小),因此可以计算出10000以内的所有素数,存储到一个数组中,方便计算素数和的时候使用。
因为一个素数的倍数都不是素数,所以可以从2的倍数开始剔除,2的倍数剔除完后剔除3的倍数,......,以此类推。
计算完素数后需要计算一个正整有多少个连续素数的表示
对每个输入,使用一个二重循环,外循环枚举所有小于等于输入的素数 a[i],内循环从a[i]开始往后加,计算连续素数的和,直到10000以内的所有素数都加完了或 和大于等于输入为止。内循环结束后,如果和与输入相等,个数加一。外循环结束后,输出个数。
我觉得这道题的重点是计算素数的方法。
但使用bool数组在POJ上未能通过编译。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <stdbool.h> 5 6 void prime(bool a[],int b[]){//离线生成素数数组 7 int i,j; 8 for(i=0;i<10000;i++) a[i]=true;//初始化布尔数组 9 for(i=2;i<(int)sqrt(10000);i++){ 10 if(a[i]){ 11 for(j=i;j*i<=10000;j++){ 12 a[j*i]=false; 13 } 14 } 15 } 16 j=0; 17 for(i=2;i<10000;i++){ 18 if(a[i]) b[j++]=i; 19 } 20 } 21 22 23 int main(void){ 24 int i,j=0,k,sum=0,ans,n=0; 25 int a[1229];//素数数组 26 bool flagArray[10000];//布尔数组 27 prime(flagArray,a); 28 while(scanf("%d",&n)==1){ 29 if(n==0) break; 30 for(i=0;a[i]<=n;i++){ 31 sum=0; 32 for(j=i;sum<n&&j<1229;j++) if(sum<n) sum+=a[j]; 33 if(sum==n) ans++; 34 } 35 printf("%d\n",ans); 36 ans=0; 37 } 38 return 0; 39 }
Sum of Consecutive Prime Numbers UVA3399 C
标签:比较 数加 view 生成 int ima scan void oid
原文地址:https://www.cnblogs.com/20174317zhuyuan/p/9386146.html