高精度数的加法
什么是高精度数?
高精度数是指一种数据范围超过long long 的数。
题目描述
求两个不超过200位的非负整数的和。
输入
有2行,每行是一个不超过200位的正整数。
注意!输入中可能有多余的前导0。
输出
一行,即输入的两个高精度数相加的结果,结果里不能有多余的前导0。
代码
#include<iostream>
#include<string> //使用string类型数据需要用到该头文件
using namespace std;
int main(){
string a,b;
int ar[201]={0},br[201]={0},cr[201]={0},c[201]={0},aLen,bLen,maxLen;
cin>>a>>b;//输入两个高精度数,分别存放在字符串a和b中
aLen=a.length();//字符串a的长度
bLen=b.length();//字符串b的长度
maxLen=max(aLen,bLen);//更大的那个长度,作为结果的长度
for(int i=0;i<aLen;i++){
ar[i]=a[aLen-i-1]-'0'; //将字符串a逆序存储在ar中,-'0'是因为'0'有值,如果不减,会造成计算错误
}
for(int i=0;i<bLen;i++){
br[i]=b[bLen-i-1]-'0';//将字符串b逆序存储在br中,-'0'是因为'0'有值,如果不减,会造成计算错误
}
for(int i=0;i<maxLen;i++){
cr[i]+=ar[i]+br[i]; //相加
cr[i+1]=cr[i]/10; //进位
cr[i]%=10; //确保自己结果不大于10
}
maxLen++; //考虑最高位有进位的情况
while(1){ //去0
if(cr[maxLen-1]>0 || maxLen==1){ // 如果不为0
break;
}
maxLen--;
}
for(int i=0;i<maxLen;i++){//将结果还原成正序
c[i]=cr[maxLen-i-1];
}
for(int i=0;i<maxLen;i++){//输出结果
cout<<c[i];
}
cout<<endl;
return 0;
}
关键点解析
关键点1:倒序时,c[i]=cr[]。
示意图,证明公式
关键点2:输入数据要存入string型变量,如果用整型变量存储的话,会出现数据溢出的情况。
例如输入:
2222222222222222222222222222222222
3333333333333333333333333333333333
关键点3:要考虑结果为0的情况,输出为0。
测试样例
输入样例1:
9
99
输出样例1:
108
输入样例2:
0099
000009
输出样例2:
108
输入样例3:
222222222222222222222
333333333333333333333
输出样例3:
555555555555555555555
输入样例4:
00
000
输出样例4:
0
网友评论