Problem Descriptionphp
素數篩法是這樣的:算法
1.開一個大的bool型數組prime[],大小就是n+1就能夠了.先把全部的下標爲奇數的標爲true,下標爲偶數(除了2)的標爲false.數組
2.而後:將素數的倍數篩掉ui
for( i=3; i<=sqrt(n); i+=2 )spa
{ if(prime[i])code
for( j=i+i; j<=n; j+=i ) prime[j]=false;blog
}ip
3.最後輸出bool數組中的值爲true的單元的下標,就是所求的n之內的素數了。get
原理很簡單,就是當i是質(素)數的時候,i的全部的倍數必然是合數。若是i已經被判斷不是質數了,那麼再找到i後面的質數來把這個質string
數的倍數篩掉。
一個簡單的篩素數的過程:n=30。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
第 1 步事後4 ... 28 30這14個單元被標成false,其他爲true。
第 2 步開始:
i=3; 因爲prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]標爲false.
i=4; 因爲prime[4]=false,不在繼續篩法步驟。
i=5; 因爲prime[5]=true, 把prime[10],[15],[20],[25],[30]標爲false.
i=6>sqrt(30)算法結束。
第 3 步把prime[]值爲true的下標輸出來:
for(i=2; i<=30; i++)
if(prime[i]) printf("%d ",i);
結果是 2 3 5 7 11 13 17 19 23 29
#include<stdio.h> bool is[9989900]; //若是i是素數,then is[i]=fasle, else is[i]=true; int prime[1000]; //prime用來存迴文素數表 void set()//高效判斷素數法:全部和數都等於N個素數的乘積 { int i,j; /*for(i=5;i<=3163;i++) is[i]=0; 因爲bool類型默認值是false,因此能夠註釋掉*/ i=2; for(j=i*i;j<=9989899;j+=i) //偶數,true的不是素數 is[j]=true; for(i=3;i<=3163;i=i+2) { if(is[i]) continue; for(j=i*i;j<=9989899;j+=i) //素數的倍數不是素數 is[j]=true; } } bool test(int a)//判斷a是否是迴文數 { int temp=a; int b=0; while(temp!=0) //每位倒置,看結果與原數是否一致 { b=b*10; b+=temp%10; temp/=10; } return a==b; } int main() { int a,b; int i,k=0; set(); for(i=5;i<=9989899;i+=2) //將最大範圍的全部知足條件的數求出來 if(!is[i]&&test(i)) prime[k++]=i; while(~scanf("%d %d",&a,&b)) //輸出給定範文的結果 { for(i=0;i<k;i++) { if(prime[i]<a) continue; else if(prime[i]<=b) printf("%d\n",prime[i]); else break; } printf("\n"); } return 0; }
方法二: #include <stdio.h> #include <string.h> int huiwen(int k) { int a[10],i=0,j; while (k>0) { a[i]=k%10; k/=10; i++; } for (j=0; j<i; j++) if (a[j]!=a[i-j-1]) return 0; return 1; } int hwlength(int k) { int a[10],i=0; while (k>0) { a[i]=k%10; k/=10; i++; } return (i); } int prime(int k) { int i; for (i=3; i*i<=k; i+=2) if (k%i==0) return 0; return 1; } int main() { int a,b,i,j; scanf("%d%d",&a,&b); for (i=a; i<=b; i++) { if (i%2==0&&i!=2) continue; if (i%5==0&&i!=5) continue; if (hwlength(i)%2==0&&i!=11) continue; if (!huiwen(i)) continue; if (prime(i)) printf("%d\n",i); } return 0; }