形如2n−1的素数称为梅森数(Mersenne Number)。例如22−1=3、23−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了231−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。
本题要求编写程序,对任一正整数n(n<20),输出所有不超过2n−1的梅森数。
输入格式:
输入在一行中给出正整数n(n<20)。
输出格式:
按从小到大的顺序输出所有不超过2n−1的梅森数,每行一个。如果完全没有,则输出“None”。
输入样例:
6
输出样例:
3
7
31
解法代码:
代码1:(PTA正解)
#include<stdio.h>
#include<math.h>
int Mersenne(int k);
int main(){
int n;
int i,aim,count=0;
scanf("%d",&n);
for(i=0;i<=n;i++){
aim=pow(2,i)-1;
if(Mersenne(aim)){
printf("%dn",aim);
count++;
}
}
if(count==0) printf("None");
return 0;
}
int Mersenne(int k){
int i;
int lim=1;
int retu=0;
if(k<2) lim=0; //直接排除main函数中i取0、1的情况
for(i=2;i<k;i++){ //判断是否是素数
if(k%i==0){
lim=0;
break;
}
}
if(lim && (k+1)%2==0){ //用(k+1)%2代替pow(2,i)的枚举判断,提升效率
retu=1;
}
return retu;
}
代码2:(代码没问题,但运行效率较低,PTA判断运行超时)
#include<stdio.h>
#include<math.h>
int Mersenne(int k);
int zhishu(int k);
int main(){
int i,n,count=0;
scanf("%d",&n);
if(n==1) printf("Nonen"); //若是n=1,无梅森数
else{
for(i=2;i<=pow(2,n)-1;i++){ //枚举给定范围内所有整数
if(zhishu(i) && Mersenne(i)){ //同时判断该数是否是素数与梅森数格式
count++; //若是,计数器+1并输出
printf("%dn",i);
}
}
if(count==0) printf("Nonen"); //若没有,则输出None
}
return 0;
}
int zhishu(int k){ //判断素数
int i,m=1;
for(i=2;i<k;i++){
if(k%i==0){
m=0;
break;
}
}
return m;
}
int Mersenne(int k){ //判断梅森数格式
int i,m=0;
for(i=2;i<20;i++){
if(pow(2,i)-1==k){
m=1;
break;
}
}
return m;
}