刷题OJ 网站!验证你的代码是否正确!!!
已知高精度加减法的,再看乘除会简单好多。那我们先看下乘法,乘法规则,是两数逐个相乘后再进行加法得出最终结果,其实就是再高精度加法前面做一个乘法操作。
一、高精度的乘法
思想:
- 把大数存到字符串;
- 对两数想乘的长度求解。
- 两数相乘最大的值长度不会超过两个数长度之和。
len_max = len1+len2-1; - 字符串的每个字符数字都通过ASCII转换存到数组。
- 注意的是要低位存在数组开头:a[i] = s[len-i-1]-‘0’;
- 乘法进位的算式:
c[i+j] += a[i] * b[j] - 对数组c进行加法进位:
c[i+1] += c[i]/10;c[i] %= 10; - 结果溢出
- 反向输出结果;
代码
#include<iostream>
#include<string>
using namespace std;
string s1,s2;
int a[100],b[100],c[200];
int main(){
cin>>s1>>s2;
int len1 = s1.size();
int len2 = s2.size();
int len_max = len1+len2-1; //
for(int i=0;i<len1;i++){
a[i] = s1[len1-i-1]-'0';
}
for(int i=0;i<len2;i++){
b[i] = s2[len2-i-1]-'0';
}
// 乘法
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
c[i+j] += a[i] * b[j];
}
}
for(int i=0;i<len_max;i++){
c[i+1] += c[i]/10;
c[i] %= 10;
}
//溢出处理,再加法进位一次
while(c[len_max]){
c[len_max+1] = c[len_max]/10;
c[len_max] %= 10;
len_max++;
}
//反向输出
for(int i=len_max-1;i>=0;i--){
cout<<c[i];
}
总长度怎么求的呢?
1.乘法两数相乘(不考虑0),一般总长度是 **【两数长度之和-1,两数长度之和】**这个区间,我这里设置 len_max = len1+len2-1;
竖式乘法求和
这样看,a数组的下标用i表示,b数组的下标用j表示,那c数组,
可以看出 c[1+0] = a[1]*b[0] + a[0]*b[1] ; 推导出: c[i+j] += a[i] * b[j]
// 乘法
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
c[i+j] += a[i] * b[j];
}
}
乘完后,c数组的值有超过9的要进行加法进位
for(int i=0;i<len_max;i++){
c[i+1] += c[i]/10;
c[i] %= 10;
}
进位完成后,接着看有无溢出,最后反向输出结果。