7-16 梅森数(2022-高级语言程序设计练习——循环结构程序设计)

目录

题目链接:

题目:

输入格式:

输出格式:

输入样例:

输出样例:

AC代码:

提交正确截图:


实现语言:C

编译器:gcc

题目链接:

题目详情 - 7-16 梅森数 (pintia.cn)

题目:

2022-高级语言程序设计练习——循环结构程序设计

7-16 梅森数

分数 20

作者 颜晖

单位 浙大城市学院

形如2^{n}-1的素数称为梅森数(Mersenne Number)。例如2^{2} - 1 = 32^{3} - 1 = 7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2^{31} - 1 = 2147483647是一个素数,堪称当时世界上“已知最大素数”的一个记录。

本题要求编写程序,对任一正整数n(n<20),输出所有不超过2^{n} - 1的梅森数。

输入格式:

输入在一行中给出正整数n(n<20)。

输出格式:

按从小到大的顺序输出所有不超过2^{n} - 1的梅森数,每行一个。如果完全没有,则输出“None”。

输入样例:

6

输出样例:

3
7
31

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

AC代码:

#include <stdio.h>
#include <math.h> //double pow(double, double)
int main()
{
    int n;
    scanf("%d", &n); // 输入在一行中给出正整数n(n<20)。
    if (n >= 2)      // 最小n==2
    {
        for (int i = 2; i <= n; i++) // 遍历2^2-1到2^n-1的所有数
        {
            int fact = 2;
            for (int j = 1; j < i; j++)
            {
                fact = fact * 2;
            }
            fact = fact - 1;
            // fact = pow(2,i)-1
            //  判断素数------------------------------------
            //  定义flag,当flag==1认为fact是素数,当flag==0认为fact不是素数
            int flag;
            flag = 1;      // 默认为fact是素数,只有以下情况才会认为fact不是素数
            if (fact <= 4) // 当fact<5时,只有fact==1或者fact==4会认为fact不是素数
            {
                if (fact == 1 || fact == 4)
                {
                    flag = 0;
                }
            }
            else // 当fact>=5时
            {
                if ((fact % 6) != 1 && (fact % 6) != 5) // 如果fact%6为2,3,4中任意一个,那么fact都不是素数
                {
                    flag = 0;
                }
                else
                {
                    for (int i = 5; i <= sqrt(fact); i += 6) // 对于%6==1或者5的数,对它用一般的素数判断方法,从5开始寻找因子,步长为6,到sqrt(fact)为止
                    {
                        if (fact % i == 0 || fact % (i + 2) == 0)
                        {
                            flag = 0;
                            break;
                        }
                    }
                }
            }
            // 判断素数------------------------------------
            if (flag == 1) // 如果2^i-1是素数,则按照题目要求输出
            {
                printf("%d\n", fact); // 按从小到大的顺序输出所有不超过2^n−1的梅森数,每行一个。
            }
        }
    }
    else // 如果完全没有,则输出“None”。
    {
        printf("None\n");
    }

    return 0;
}

提交正确截图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Curran-YU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值