马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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的类型
|