Sum of Consecutive Prime Numbers POJ - 2739 线性欧拉筛(线性欧拉筛证明)

题意:给一个数 可以写出多少种  连续素数的合

思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数)

其中:线性筛的证明参考:https://blog.csdn.net/nk_test/article/details/46242401

            https://blog.csdn.net/qq_40873884/article/details/79124552

            https://blog.csdn.net/baoli1008/article/details/50788512

线性筛的思想 就是 每个数都有一个最小的质因素  外层i是质因数个数 内层j是primes[i]的标号  用每个质因数筛 每个数只要被筛一遍

      同时, if(i%primes[j]==0 )break; 这里指的是如果i%primes[j]==0了 那么i就有因数 primes[j] 所以i*prime[j+1]肯定已经被筛掉了

                      因为是从小到大开始筛的,i中还有primes[j] 说明 i*primes[j+1]最小的质因数等于primes[j]  所以肯定会被筛掉 只是可能循环轮次

      不同,可能是下一个i或者其他i

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 bool Is_Primes[10005];
 5 int Primes[10005];
 6 int cnt;
 7 void Prime(int n){
 8      cnt=0;
 9      memset(Is_Primes,0,sizeof(Is_Primes));
10     for(int i=2;i<=n;i++){
11         if(!Is_Primes[i])
12             Primes[cnt++]=i;
13         for(int j=0;j<cnt&&i*Primes[j]<n;j++){
14             Is_Primes[Primes[j]*i]=1;
15             if(i%Primes[j]==0)break;
16         }
17     }
18 }
19 int main(){
20     int n;
21     Prime(10003);
22     while(scanf("%d",&n)==1&&n){
23         int ans=0;
24         for(int i=0;i<cnt&&Primes[i]<=n;i++){
25             int temp=i;
26             int sum=0;
27             while(sum<n&&temp<cnt){
28                 sum+=Primes[temp++];
29             }
30             if(sum==n)ans++;
31         }
32         int flag=0;
33     
34         printf("%d\n",ans);
35     }
36     return 0;
37 }

 

posted @ 2019-01-16 21:41  tttttttttrx  阅读(142)  评论(0编辑  收藏  举报