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