麦森数
作者:互联网
题目描述
输入格式
文件中只包含一个整数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