高精度乘法
2024-03-21 15:48:46
发布于:浙江
27阅读
0回复
0点赞
本题需要求麦森数,由于在做乘法的过程中为其中结果的数据比较大 ,因此需要采用高精度乘法,解题步骤如下 :
第一步 :输出位数 ;
1)位数公式是floor(log(2)/log(10)*n+1)
第二步 :计算麦森数,采用高精度的方法
1 )高精度乘法运算
2 )为了提升效率 每次乘40个数字
3 )进一步提升效率,采用数组压位
第三步 :输出麦森数字
1)输出先导0
2)每50个数字进行换行
3)最后一位比较特殊,单独输出
#include<iostream>
#include<cmath>
using namespace std;
long long a[129] , n , sum = 0;
int main(){
int i ;
cin >> n;
cout << floor(log(2) / log(10) * n + 1) << endl;
a[1] = 1;
for(i = 0 ; i <= n - 40 ; i = i + 40){
for(int j = 1 ; j <= 125 ; j++){
if(a[j] != 0){
a[j] = a[j] * 1099511627776;
}
}
for(int j = 1 ; j <= 125 ; j++){
if(a[j] > 9999){
//进位……
a[j+1] = a[j+1] + a[j] / 10000,
a[j] = a[j] % 10000;
}
}
}
for( ; i < n ; i++){
for(int j = 1 ; j <= 125 ; j++){
if(a[j] != 0){
a[j] = a[j] * 2;
}
}
for(int j = 1 ; j <= 125 ; j++){
if(a[j] > 9999){
a[j+1] = a[j+1] + a[j] / 10000,
a[j] = a[j] % 10000;
}
}
}
for(i = 125 ; i > 1 ; i--){
cout << a[i] / 1000 << a[i] / 100 % 10;
sum = sum + 2;
if(sum == 50){
cout << endl;
sum = 0;
}
cout << a[i] / 10 % 10 << a[i] % 10;
sum = sum + 2;
if(sum == 50){
cout << endl;
sum = 0;
}
}
cout<<a[1] / 1000 << a[1] / 100 % 10 << a[1] / 10 % 10 << a[1] % 10 - 1;
return 0;
}
这里空空如也
有帮助,赞一个