[高精度乘法]【蓝桥 算法提高 高精度乘法】模拟乘法 图解 例题
【蓝桥】例题
http://lx.lanqiao.cn/problem.page?gpid=T311
高精度乘法
http://lx.lanqiao.cn/problem.page?gpid=T70
高精度加法
一、为什么要高精度?
题目要求乘法加法的数值过大,超出范围,不能正常计算,因此需要把数字存在数组,每一个元素当成数字的每一位,模拟计算的过程。
二、高精度乘法图解及分析
1.把数字塞进数组后竖式乘法就可以发现 规律 C[i+j] = a[i]+c[i]
2.但我们会发现数字相乘会存在进位,所以我们得反着存,所以在数组中是这样的
3 由于前面是反着存的所以输出需要从后往前输出
三 具体实现步骤
1 将数据存进字符串中
2 将字符串反转并存在数组里
string a1;
string b1;
int a[10000],b[10000];
cin>>a1,cin>>b1;
for(int i = a1.length()-1,k=0;i>=0;i--){
a[i] = a1[k++]-'0';
}
for(int i = b1.length()-1,k=0;i>=0;i--){
b[i] = b1[k++]-'0';
}
3 模拟乘法(注意进位问题)
for(int i = 0;i<a1.length();i++){
for(int j = 0;j<b1.length();j++){
A[i+j] += a[i]*b[j];
A[i+j+1] += A[i+j]/10;
A[i+j]%=10;
}
}
4 删除前导0,并且反向输出
int len = a1.length()+b1.length();
while(A[len]==0&&len>0) len--;
for(int i = len;i>=0;i--){
cout<<A[i];
}
四 完整代码
#include<bits/stdc++.h>
using namespace std;
int A[100000001]={0}; // 答案
int main(){
string a1;
string b1;
int a[10000],b[10000];
cin>>a1,cin>>b1;
for(int i = a1.length()-1,k=0;i>=0;i--){
a[i] = a1[k++]-'0';
}
for(int i = b1.length()-1,k=0;i>=0;i--){
b[i] = b1[k++]-'0';
} // 反转存储
// cout<<a[0]<<" "<<a[1];
for(int i = 0;i<a1.length();i++){
for(int j = 0;j<b1.length();j++){
A[i+j] += a[i]*b[j];
A[i+j+1] += A[i+j]/10;
A[i+j]%=10;
}
}
int len = a1.length()+b1.length();
while(A[len]==0&&len>0) len--;
for(int i = len;i>=0;i--){
cout<<A[i];
}
return 0;
}
附加 高精度加法
总体而言差不多 区别在于模拟加法和位数控制不一样
#include<bits/stdc++.h>
using namespace std;
int ans[1000000]={0};
int main(){
string a1,b1;
cin>>a1>>b1;
int a[10000],b[10000];
for(int i = a1.length()-1,k=0;i>=0;i--){
a[i] = a1[k++]-'0';
}
for(int i = b1.length()-1,k=0;i>=0;i--){
b[i] = b1[k++]-'0';
} // 反转存储
for(int i = 0;i<a1.length()||i<b1.length();i++){
ans[i] += a[i]+b[i];
ans[i+1]+=ans[i]/10;
ans[i] %=10;
// cout<<ans[i]<<endl;
}
int len = max(a1.length(),b1.length())+1;
while(ans[len]==0)len--;
for(int i = len;i>=0;i--){
cout<<ans[i];
}
return 0;
}