梅森素数(C语言求解)

梅森数(Mersenne Prime)指的是形如 2^{n}-1的正整数,其中指数 n 是素数。如果一个梅森数是素数,则称其为梅森素数

另外,由因式分解法可以证明,如果 2^{n}-1 是素数,则 n 也一定是素数。

例如,当 n=2,3,5,7 时,2^{n}-1 都是素数,但 n=11 时,2^{n}-1 显然不是梅森素数。

迄今为止,人类仅发现了 51 个梅森素数。梅森素数历来都是数论研究中的一项重要内容,也是当今科学探索中的热点和难点问题。

试求出指数 n<20 的所有梅森素数。

问题分析

要编程求解的问题是找出指数 n<20 的所有梅森素数。根据梅森素数的定义,我们可以先求出n<20的所有梅森数,再逐一判断这些数是否为素数。如果是素数,则表示该数为梅森素数,打印输出即可;否则不是梅森素数。

算法设计

要求出 n<20 的所有梅森数,因此在本题的算法设计中需要釆用循环结构。

设变量 mp 存储梅森数,整数 i 表示指数,其取值从 2〜19,i 每变化一次,都相应的计算出一个梅森数,存放在 mp 中。对每次计算得到的当前 mp 值,都调用函数 prime() 进行判断。

在判断 mp 是否为素数时,可以定义一个函数 prime(),每次都将 mp 的当前值作为实参传递给函数prime(),并判断是否为素数。如果 n 为素数,则 prime() 函数返回值为 1,否则 prime() 函数返回值为 0。

若 prime() 函数返回值为 1,则当前 mp 为梅森素数,应该将其输出;若 prime() 函数返回值为 0,则当前 mp 不是梅森素数。

程序流程图:

下面是完整的代码:

#include <stdio.h>
#include <math.h>
int prime(int n)
{
    int i;
    long k;
    k = sqrt(n) + 1;
    for (i = 2; i <= k; i++)
    	if (n%i == 0)
    	    return 0;
        return 1;
}
int main()
{
    int mp, n = 0, i;
    printf("MersennePrime:\n");
    for (i = 2; i <= 20; i++)
    {
    	mp = pow(2, i) - 1;
	if (prime(mp))
	{
	    n++;
	    printf("M(%d)=%d", i, mp);
       	    printf("\n");
	}
    }
    printf("thenumber of Mersenne Prime less than 20 is:%d\n", n);
    return 0;
}

运行结果:

Mersenne Prime:
M(2)=3
M(3)=7
M(5)=31
M(7)=127
M(13)=8191
M(17)=131071
M(19)=524287
the number of Mersenne Prime less than 20 is:7

提示:想快速入门 C 语言的,尤其是小白、初学者,给大家推荐一套 C 语言教程,我之前就是看这套教程学会的:

https://xiexuewu.github.io/c/icon-default.png?t=N7T8https://xiexuewu.github.io/c/整套教程通俗易懂,知识点全面,关键是提供了完整、可运行的 C 语言程序,对初学者非常友好!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据结构和算法教程(C语言版)

创作不易,多多支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值