其他分享
首页 > 其他分享> > 麦森数

麦森数

作者:互联网

题目描述

输入格式

文件中只包含一个整数P(1000<P<3100000)

输出格式

第一行:十进制高精度数2p−1的位数。

第2-11行:十进制高精度数2p−1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)

思路:

1)求位数

 

 

 

 2)快速幂+高精度乘法

 

 

 代码:

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int p, f[1100], rev[1100], t[1100];//乘法开两倍
void res_1() {//rev=rev*f(高精度)
    memset(t,0, sizeof(t));
    for (int i = 1; i <= 500; i++) {
        for (int j = 1; j <= 500; j++) {
            t[i + j - 1] += f[j] * rev[i];
            t[i + j] += t[i + j - 1] / 10;
            t[i + j - 1] %= 10;
        }
    }
    memcpy(rev, t, sizeof(rev));
}
void res_2() {//f=f*f
    memset(t, 0, sizeof(t));
    for (int i = 1; i <= 500; i++) {
        for (int j = 1; j <= 500; j++) {
            t[i + j - 1] += f[j] * f[i];
            t[i + j] += t[i + j - 1] / 10;
            t[i + j - 1] %= 10;
        }
    }
    memcpy(f, t, sizeof(f));
}
int main() {
    cin >> p;
    cout << (int)(p * log10(2)) + 1 << endl;
    rev[1] = 1;
    f[1] = 2;
    while (p) {
        if (p % 2 == 1)res_1();
        p /= 2;
        res_2();
    }
    rev[1]--;
    for (int i = 500; i > 0; i--) {
        if (i % 50 == 0&&i!=500)cout << endl;
        cout << rev[i];
    }
}

视频:https://www.bilibili.com/video/BV1Tf4y1P7ED?spm_id_from=333.1007.top_right_bar_window_history.content.click

标签:高精度,int,麦森数,rev,1100,include,500
来源: https://www.cnblogs.com/wxywhs/p/15855545.html