1.P1601 A+B Problem(高精)
题目描述
高精度加法,相当于a+b problem,不用考虑负数.
输入格式
分两行输入。a,b (a,b≤10^500)
输出格式
输出只有一行,代表a+b的值
输入输出样例:
输入
1001
9099
输出
10100
(题目来源:洛谷P1601)
分析:
因为样例是10的500次方,远远超出了long long的数据范围,所以采用高精度模拟加法运算,具体内容代码中有注释。
写这个的原因是因为百度上那些大佬的运算符重载的方法我没有看懂,所以试着写了个自己能理解的,可以通过洛谷P1601题。(果然我是蒟蒻)
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int BIT=600;
int a[BIT],b[BIT],c[BIT];
string ai,bi;
int main()
{
int lena,lenb,i;
cin>>ai;
cin>>bi;
//统计a,b字符串长度
lena=ai.size();
lenb=bi.size();
//将a,b逆序存入数组,注意字符串是从0开始,数组是从1开始
//减去48是因为字符串是char型,数组是int型
for(i=1;i<=lena;i++)
{
a[i]=ai[lena-i]-48;
}
for(i=1;i<=lenb;i++)
{
b[i]=bi[lenb-i]-48;
}
//每一位的个位是在1,所以从低位往高位相加进位
for(i=1;i<=max(lena,lenb)+1;i++)
{
c[i]+=a[i]+b[i];
if(c[i]>=10)
{
c[i]=c[i]%10;
c[i+1]++;
}
}
//用i存c的位数
//由于i本身就比他们的最高位高一位,以及末尾的i++,所以需要减2得到c的位数
i=i-2;
if(c[i+1]>0)
i++;
//特判更高一位大于0,就把位数扩充一位
int maxw=i;
//存储一下最高位,用于后面的判断消除首位0
for(;i>=1;i--)
{
//防止相加后c为0
if(maxw==1)
{
cout<<c[i];
break;
}
//首位如果为0就不输出
if(i==maxw&&c[i]==0)
{
continue;
}
cout<<c[i];
}
return 0;
}