蓝桥-ALGO-26-麦森数

228 篇文章 1 订阅
182 篇文章 3 订阅

ACM模版

描述

描述

题解

我想先建议出这道题或者翻译这道题的人去看看 《具体数学》这本书的 P91,了解了解基础的概念……

梅森数,又叫麦森数,不过我也是今天才知道还叫麦森数,不过,只要是形如 2p1 的数都是梅森数(p 是素数),如果说 x=2p1 中 x 和 p 都是素数,那么这个 x 则称为梅森素数……到1998年底,人们找到的梅森素数找到了37个,不是梅森数找到了37个,梅森数有无数个……截止2013年,已经发现了 48 个梅森素数,在过去的500年中,人类对最大的素数的认知一直都是梅森素数,梅森素数存在的意义十分大!

这个题中,首先让输出位数,其实这是一个公式, 2n 的位数等于 (int)(nlog10(2))+1 ,这里不用考虑 -1 后位数是否会发生变化,因为 2n 是由 n 个质数 2 连乘的,根本不存在尾数为 0 的可能。

至于如何求具体的后五百位,其实这也不难,类似于快速幂的求法,其实就是一个二分思想。

代码

#include <stdio.h>
#include <math.h>
#include <string.h>

const int MAXBIT = 501;

int num[MAXBIT];
int tmp[MAXBIT];
int tep[MAXBIT];

void multiply(int a[], int b[])
{
    memset(tep, 0, sizeof(tep));

    for (int i = MAXBIT - 1; i >= 1; i--)
    {
        for (int j = MAXBIT - 1, k = i; j >= 1; j--)
        {
            tep[k--] += a[i] * b[j];
            if (k == 0)
            {
                break;
            }
        }
    }

    for (int i = MAXBIT - 1; i >= 1; i--)
    {
        if (tep[i] >= 10)
        {
            tep[i - 1] += tep[i] / 10;
            tep[i] %= 10;
        }
        a[i] = tep[i];
    }
}

void msss(int power)
{
    if (power <= 1)
    {
        num[MAXBIT - 1] *= 2;
        return ;
    }
    else
    {
        msss(power / 2);
        multiply(num, num);
        if (power % 2 != 0)
        {
            multiply(num, tmp);
        }
    }
}

int main()
{
    int p;
    scanf("%d", &p);

    num[MAXBIT - 1] = 1;
    tmp[MAXBIT - 1] = 2;
    msss(p);
    num[MAXBIT - 1]--;

    printf("%d\n", (int)(p * log10(2)) + 1);
    for (int i = 1; i < MAXBIT; i++)
    {
        printf("%d", num[i]);
        if (i % 50 == 0)
        {
            printf("\n");
        }
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值