高精度数(大整数)加法

2019-05-21  本文已影响0人  朱红_fc5d

高精度数的加法

什么是高精度数?

高精度数是指一种数据范围超过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[maxLen-i-1]。


示意图,证明公式

关键点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

上一篇 下一篇

猜你喜欢

热点阅读