形如2n−1的素数称为梅森数(Mersenne Number)。例如22−1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了1是一个素数,堪称当时世界上“已知最大素数”的一个记录。
本题要求编写程序,对任一正整数n(0),输出所有不超过2n−1的梅森数。
输入格式:
输入在一行中给出正整数n(0)。
输出格式:
按从小到大的顺序输出所有不超过2n−1的梅森数,每行一个。如果完全没有,则输出“None”。
输入样例:
6
输出样例:
3
7
31
1 #include<stdio.h> 2 int main() 3 { 4 int ncf(int n); 5 int i,j,n,sum,pd,jishu;//定义判断变量 6 jishu=0;//初始化计数值等于0 7 scanf("%d",&n);//输入n<20的数 8 for(i=1;i<=n;i++)//开始循环,共运行n次,注意:因为n次方从1开始,所以i从1开始 9 { 10 pd=1;//判断=1 11 sum=ncf(i);//计算2^n-1的值; 12 for(j=2;j<sum;j++) 13 { 14 if(sum%j==0)//能除尽则不是素数 15 { 16 pd=0;//能除尽判断=0 17 break;//记录pd值=0并跳出循环 18 } 19 } 20 if(pd==1)//如果判断值=1;即不能被整除,说明是素数 21 { 22 if(sum>2)//素数大于2 23 { 24 printf("%d\n",sum);//输出素数 25 jishu++;//计数器加一 26 } 27 } 28 } 29 if(jishu==0)//如果计数器等于0,则说明没有符合条件的素数 30 { 31 printf("None\n");//输出NONE 32 } 33 } 34 35 36 37 //以下为计算n次方-1的函数 38 int ncf(int n) 39 { 40 int k,ss,su; 41 ss=2; 42 su=2; 43 if(n==0) 44 { 45 su=0; 46 }else if(n==1) 47 { 48 su=1; 49 }else 50 { 51 for(k=2;k<=n;k++) 52 { 53 su=su*ss; 54 } 55 su=su-1; 56 } 57 58 return su; 59 }