蓝桥杯——趣味素数问题(2017.2.3)

来源:互联网 发布:linux 卸载jdk1.7 编辑:程序博客网 时间:2024/05/21 22:28

一、基本素数问题回顾

1. 求给定范围start~end之间的所有素数(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之间的素数个数为%d\n",start,end,num);} return 0;}
程序截图:


2. 输入一个正整数n,判断该数是否为素数

源代码:

#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是素数\n",n);elseprintf("%d不是素数\n",n);}return 0;}

程序截图:


3. 输入一个正整数n,输出第n个素数(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;                  //因素数数组较大,用折半查找法素数数组下标,若下标+1=n,则输出对应第n个素数 while(low<=high){mid=(low+high)/2;if(mid==n){printf("第%d个素数是:%d\n",n,prime[n-1]);break;}else if(mid<n)low=mid+1;elsehigh=mid-1;}printf("\n");}int main(){int n,prime[maxn]={0};while(scanf("%d",&n)!=EOF)Prime(prime,n); return 0;}

程序截图:


二、哥德巴赫猜想

         输入2000以内不小于4的正偶数n,将其分解为两个素数之和(即验证哥德巴赫猜想对2000以内的正偶数恒成立)

源代码:

#include <stdio.h>#include <math.h>#define maxn 2000void Split(int prime[],int n)            //正偶数分解 {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++)                   //表示为两个素数之和,且前者小于后者 {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;}

程序截图:


另:控制不只一组解的情况下,输出第一个素数最小的那组解

源代码:

#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;                                            //输出一组解的标志 if(n==prime[i]+prime[j] && prime[i]<=prime[j])   //发现符合要求的一组解,输出之,并将ok标志置为1 {printf("%d=%d+%d\n",n,prime[i],prime[j]);ok=1;}if(ok==1)                                        //随后不在查找其他符合要求的解,直接跳出内外层循环 break;}if(ok==1)break;}}int main(){int n,prime[maxn]={0};while(scanf("%d",&n)!=EOF)Split(prime,n);return 0;}
程序截图:


三、可逆素数

        从小到大输出所有4位数的可逆素数

        可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数

源代码:

#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)                                  //求一个数的“反序数”,如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组数换一行 printf("\n");} }}return 0;}

程序截图:


四、回文素数

        求出所有不超过1000的回文素数

        回文素数是指:一个整数n,其为素数,且从左向右和从右向左读数值都相同

源代码:

#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)                             //求"反序数"{reversenum=reversenum*10+t%10;t/=10;}if(is_Prime(i))                        //i为素数 {if(i==reversenum)                  //且i从左向右和从右向左数值相同,输出i printf("%d\n",i);}}return 0;}

程序截图:


五、孪生素数

        求出m~n之间(包括m和n)的孪生素数,用(x,x+2)的形式表示

        孪生素数是指:间隔为2的两个相邻素数(如(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;}
程序截图:


六、梅森素数

        求出指数为n(n<20)的所有梅森素数

        梅森素数是指:形如 2^n-1 的正整数,其中指数n是素数,且 2^n-1 也是素数

源代码:

#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;}

程序截图:


0 0
原创粉丝点击