高精度计算1——加法
为什么要使用高精度计算?
当进行很大的数的计算时,我们不管是用int(整型)还是long long(长整型)都是有一定位数限制的,当我们要计算的数为几十位或几百几千位时,我们就要考虑使用高精度运算。
思想
就是将这些数字分别读入数组,然后诸位去求,最后输出结果
高精度加法实现
可以直接读入数组,也可以用字符串读入后再处理,我这儿使用的是用字符串读入两个数,然后再读入int数组的方法
实现步骤
1、用字符串 s1,s2读入两个数
2、倒序存入数 int a[250],b[250,用c[250]储存计算结果(假设计算的数不超过240位),用int存放的原因,一个元素可以存放两个数字,如12,倒序存入的原因是我们输入的两个字符串长度可能不同,这样低位天然对齐,不用再额外去处理,这样就可以从前往后顺序去加,并在进位时不会存在越界的问题
3、c[i]=a[i]+b[i]
4、判断c中每个元素并进位,c[i+1]=c[i+1]+c[i]/10;c[i]=c[i]%10;
5、倒序输出c中元素
例如
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|---|
s1 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
s2 | 3 | 3 | 3 | 3 | 4 | ||||||
逆序读入到a和b数组中 | |||||||||||
a | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 1 | |
b | 4 | 3 | 3 | 3 | 3 | ||||||
c | 13 | 11 | 10 | 9 | 8 | 3 | 2 | 1 | 1 | ||
c进位 | 3 | 2 | 1 | 0 | 9 | 3 | 2 | 1 | 1 | ||
倒序输出c | 1 | 1 | 2 | 3 | 9 | 0 | 1 | 2 | 3 |
代码:
#include <bits/stdc++.h>
using namespace std;
int a[250],b[250],c[250];
string s1,s2;
int main(){
cin>>s1;
cin>>s2;
int i,j=0;
//将s1中的数倒序读入数组a
for(i=s1.size()-1;i>=0;i--){
a[j]=s1[i]-'0';
j++;
}
//将s2中的数倒序读入数组b
int k=0;
for(i=s2.size()-1;i>=0;i--){
b[k]=s2[i]-'0';
k++;
}
//计算c的值
int len;
(j>k) ? len=j : len=k;
for(i=0;i<len;i++){
c[i]=a[i]+b[i];
}
//进位
for(i=0;i<len;i++){
if(c[i]>=10){
c[i+1]=c[i+1]+c[i]/10; //or c[i+1]=c[i+1]+1;如果乘法用前面式子
c[i]=c[i]%10;
}
}
if(c[len]>0) len=len+1;
for(i=len-1;i>=0;i--){
cout<<c[i];
}
return 0;
}