【高精度】大数加法

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值