马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
形如2​n​​−1的素数称为梅森数(Mersenne Number)。例如2​2​​−1=3、2​3​​−1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2​31​​−1=2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。 本题要求编写程序,对任一正整数n(n<20),输出所有不超过2​n​​−1的梅森数。 输入格式:输入在一行中给出正整数n(n<20)。 输出格式:按从小到大的顺序输出所有不超过2​n​​−1的梅森数,每行一个。如果完全没有,则输出“None”。 输入样例:6
输出样例:3731#include <stdio.h>
#include <math.h>
int main()
{
int n,i,j;//is=1;
int x;
scanf("%d",&n);
if(n==1) printf("None\n");
for(i=2;i<=n;i++){
x=pow(2,i)-1;//输出从3开始的等于2的n次方-1的数
for(j=2;j<x;j++){
if(x%j==0) {
break;
}
if(j>x/2)printf("%d\n",x);
}
}
return 0;
}
运行结果:
3
7
7
7
31
31
31
31
31
31
31
31
31
31
31
31
31
31
31
为什么重复这么多次啊,请问各位大佬怎么改呀?输出素数条件有没有更简单的算法?不用循环到x;(j>x/2)做输出条件?
本帖最后由 EthanHsiung 于 2020-1-27 10:27 编辑
if(j>x/2)printf("%d\n",x);
if 后面的语句没有大括号,还要加上break;
if(j>x/2){
printf("%d\n",x);
break;}
判断素数没必要循环到(j>x/2)做输出条件
x的平方根:只需被 2 ~ 根号x之间的每一个整数去除就可以了。如果 x 不能被 2 ~ 根号x 间任一整数整除,x 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
求平方根,注意sqrt()的参数为 double 类型,这里要强制转换x的类型
|