Sum of Consecutive Prime Numbers UVA3399 C

这道题中由于素数的范围只有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 }
View Code

猜你喜欢

转载自www.cnblogs.com/20174317zhuyuan/p/9386146.html