ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

麦森数

2022-01-29 18:00:42  阅读:161  来源: 互联网

标签:高精度 int 麦森数 rev 1100 include 500


题目描述

输入格式

文件中只包含一个整数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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有