1. 程式人生 > >Sum of Consecutive Prime Numbers POJ - 2739 線性歐拉篩(線性歐拉篩證明)

Sum of Consecutive Prime Numbers POJ - 2739 線性歐拉篩(線性歐拉篩證明)

sin nbsp ret 一個數 detail scan 就是 blog ace

題意:給一個數 可以寫出多少種 連續素數的合

思路:直接線性篩 篩素數 暴力找就行 (素數到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 }

Sum of Consecutive Prime Numbers POJ - 2739 線性歐拉篩(線性歐拉篩證明)