形如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 }