一、基本素數(shù)問題回顧
1. 求給定范圍start~end之間的所有素數(shù)(1<=start<end)
源代碼:
#include <stdio.h>#include <math.h>int main(){ int start,end; int i,j,k,num,flag; while(scanf("%d %d",&start,&end)!=EOF) { num=0; for(i=start;i<=end;i++) { k=sqrt(i); flag=1; for(j=2;j<=k;j++) { if(i%j==0) { flag=0; break; } } if(flag==1) //此處寫 j>=k+1 亦可 { num++; PRintf("%d ",i); if(num%10==0) printf("/n"); } } printf("/n%d~%d之間的素數(shù)個數(shù)為%d/n",start,end,num); } return 0;}程序截圖:
2. 輸入一個正整數(shù)n,判斷該數(shù)是否為素數(shù)
源代碼:
#include <stdio.h>#include <math.h>int is_Prime(int n){ int i; int flag=1; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } return flag;}int main(){ int n; while(scanf("%d",&n)!=EOF) { if(is_Prime(n)) printf("%d是素數(shù)/n",n); else printf("%d不是素數(shù)/n",n); } return 0;}程序截圖:

3. 輸入一個正整數(shù)n,輸出第n個素數(shù)(n<=10000)
源代碼:
#include <stdio.h>#include <math.h>#define maxn 100000void Prime(int prime[],int n){ int i,j,k; int flag,t=0; int low,high,mid; for(i=2;i<=150000;i++) { k=sqrt(i); flag=1; for(j=2;j<=k;j++) { if(i%j==0) { flag=0; break; } } if(flag==1) prime[t++]=i; } low=0,high=t-1; //因素數(shù)數(shù)組較大,用折半查找法素數(shù)數(shù)組下標(biāo),若下標(biāo)+1=n,則輸出對應(yīng)第n個素數(shù) while(low<=high) { mid=(low+high)/2; if(mid==n) { printf("第%d個素數(shù)是:%d/n",n,prime[n-1]); break; } else if(mid<n) low=mid+1; else high=mid-1; } printf("/n");}int main(){ int n,prime[maxn]={0}; while(scanf("%d",&n)!=EOF) Prime(prime,n); return 0;}
程序截圖:

二、哥德巴赫猜想
輸入2000以內(nèi)不小于4的正偶數(shù)n,將其分解為兩個素數(shù)之和(即驗證哥德巴赫猜想對2000以內(nèi)的正偶數(shù)恒成立)
源代碼:
#include <stdio.h>#include <math.h>#define maxn 2000void Split(int prime[],int n) //正偶數(shù)分解 { int i,j,k; int num=0,flag; for(i=2;i<=2000;i++) { k=sqrt(i); flag=1; for(j=2;j<=k;j++) { if(i%j==0) { flag=0; break; } } if(flag==1) prime[num++]=i; } for(i=0;i<num;i++) //表示為兩個素數(shù)之和,且前者小于后者 { for(j=0;j<num;j++) { if(n==prime[i]+prime[j] && prime[i]<=prime[j]) printf("%d=%d+%d/n",n,prime[i],prime[j]); } }}int main(){ int n,prime[maxn]={0}; while(scanf("%d",&n)!=EOF) Split(prime,n); return 0;}程序截圖:

另:控制不只一組解的情況下,輸出第一個素數(shù)最小的那組解
源代碼:
#include <stdio.h>#include <math.h>#define maxn 2000void Split(int prime[],int n){ int i,j,k; int num=0,flag,ok; for(i=2;i<=2000;i++) { k=sqrt(i); flag=1; for(j=2;j<=k;j++) { if(i%j==0) { flag=0; break; } } if(flag==1) prime[num++]=i; } for(i=0;i<num;i++) { for(j=0;j<num;j++) { ok=0; //輸出一組解的標(biāo)志 if(n==prime[i]+prime[j] && prime[i]<=prime[j]) //發(fā)現(xiàn)符合要求的一組解,輸出之,并將ok標(biāo)志置為1 { printf("%d=%d+%d/n",n,prime[i],prime[j]); ok=1; } if(ok==1) //隨后不在查找其他符合要求的解,直接跳出內(nèi)外層循環(huán) break; } if(ok==1) break; }}int main(){ int n,prime[maxn]={0}; while(scanf("%d",&n)!=EOF) Split(prime,n); return 0;}程序截圖:
三、可逆素數(shù)
從小到大輸出所有4位數(shù)的可逆素數(shù)
可逆素數(shù)是指:一個素數(shù)將其各位數(shù)字的順序倒過來構(gòu)成的反序數(shù)也是素數(shù)
源代碼:
#include <stdio.h>#include <math.h>int is_Prime(int n){ int i; int flag=1; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } return flag;}int main(){ int i,j,wei; int reversenum,num=0; for(i=1000;i<=9999;i++) { if(is_Prime(i)) { j=i,wei=1000,reversenum=0; while(j>0) //求一個數(shù)的“反序數(shù)”,如1234->4321 { reversenum+=((j%10)*wei); j/=10; wei/=10; } if(is_Prime(reversenum)) { printf("%d -- %d ",i,reversenum); num++; if(num%4==0) //控制每輸出4組數(shù)換一行 printf("/n"); } } } return 0;}程序截圖:

四、回文素數(shù)
求出所有不超過1000的回文素數(shù)
回文素數(shù)是指:一個整數(shù)n,其為素數(shù),且從左向右和從右向左讀數(shù)值都相同
源代碼:
#include <stdio.h>#include <math.h>int is_Prime(int n){ int i; int flag=1; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } return flag;}int main(){ int i,t,reversenum; for(i=1;i<=9999;i++) { reversenum=0; t=i; while(t>0) //求"反序數(shù)" { reversenum=reversenum*10+t%10; t/=10; } if(is_Prime(i)) //i為素數(shù) { if(i==reversenum) //且i從左向右和從右向左數(shù)值相同,輸出i printf("%d/n",i); } } return 0;}程序截圖:

五、孿生素數(shù)
求出m~n之間(包括m和n)的孿生素數(shù),用(x,x+2)的形式表示
孿生素數(shù)是指:間隔為2的兩個相鄰素數(shù)(如(1,3),(3,5),(11,13)等)
源代碼:
#include <stdio.h>#include <math.h>int is_Prime(int n){ int i; int flag=1; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } return flag;}int main(){ int i,m,n; while(scanf("%d %d",&m,&n)!=EOF) for(i=m;i<=n;i++) { if(is_Prime(i) && is_Prime(i+2)) printf("(%d,%d)/n",i,i+2); } return 0;}程序截圖:
六、梅森素數(shù)
求出指數(shù)為n(n<20)的所有梅森素數(shù)
梅森素數(shù)是指:形如 2^n-1 的正整數(shù),其中指數(shù)n是素數(shù),且 2^n-1 也是素數(shù)
源代碼:
#include <stdio.h>#include <math.h>int is_Prime(int n){ int i; int flag=1; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { flag=0; break; } } return flag;}int main(){ int i,j,n; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { j=pow(2,i)-1; if(is_Prime(i) && is_Prime(j)) printf("pow(2,%d)=%d/n",i,j); } } return 0;}程序截圖:

新聞熱點
疑難解答