题解 P1601 【A+B Problem(高精)】
以前的我最最讨厌的,就是在一个很不起眼的题目中,(本以为很简单可以AC) 一定要用到高精度才可以过,于是就无数次回避它,但今天重新回望它,才发现,原来我一直害怕的,也不过如此。
切入正题:
顾名思义,高精度加法,就是指在int以及long long int等无法承受的范围中运行,其思想类似于我们小学学的加法竖式。
如图:
上AC代码:
#include<iostream>
#include<cstring>
using namespace std;
int c[50300],a1[51000],b1[51000];
int main()
{
string a,b;
cin>>a>>b;
int l=0,s=0;
for(int i=a.length()-1;i>=0;i--)
a1[i]=a[l++]-'0'; //将字符转化成数字的同时将字符串进行翻转(翻转类似于algorithm库中的severse函数)
for(int i=b.length()-1;i>=0;i--)
b1[i]=b[s++]-'0';
int len=max(a.length(),b.length())+1;
for(int i=0;i<len;i++)
{
c[i]=a1[i]+b1[i]+c[i];
c[i+1]=c[i]/10; //进位操作,将前一位得到的整十倍累加到后一位。
c[i]=c[i]%10;//得到整理后的c数组
}
while(c[len-1]==0&&len>1)len--; //一定要记得len>1
for(int i=len-1;i>=0;i--)
cout<<c[i];
}
最后强调几点问题:
- 输入要用cin或者scanf,不要用gets或gentline,因为换行符\n会被误认为你输入的字符串之一。
- 不要直接对字符数组a操作,因为没有被赋值的空间在相加时会出错,所以要将a中数组重新存在int类型的新数组中,此处为a1.
- 最后要把数字前面的0删掉,一定要记得len>1,因为如果不这样做,0+0会被卡。
(全剧终)