题解 P1601 【A+B Problem(高精)】

· · 题解

曾经很讨厌高精度,因为它很长,不好记,而且在不是很单纯的题目里面感觉很烦(一个数就是一个数组)。在一道题目中出现的时候总是用一些奇技淫巧混过去(比如把两个long long拼在一起)。 现在...还是正视了这个问题,有时候该写还是要写的(毕竟联赛不能用_int128什么的)抽空把它搞成了一个结构体封装的形式,看起来要清爽一些。 就从这个小水题开始吧:

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define N 505
#define ll long long
#define INF 0x3f3f3f3f
struct BT//BigInt
{
    int a[N],len;
    BT()//初始化
    {
        memset(a,0,sizeof(a));
        len=1;
    } 
    BT operator + (const BT &A)const
    {
        BT B;
        B.len=max(len,A.len);
        for(int i=0;i<B.len;i++)
        {
            B.a[i]+=A.a[i]+a[i];
            if(B.a[i]>=10)
            {//进位 9+9=18 进位不会超过10 
                B.a[i]-=10;
                B.a[i+1]++;
            }
        }
        if(B.a[B.len])//进到了下一位
            B.len++; 
        return B;
    }
    void read()
    {
        char d[N];
        scanf("%s",d);
        int l=strlen(d);
        for(int i=0;i<l;i++)
            a[i]=d[l-i-1]-'0';
        len=l;
    }
    void write()
    {
        for(int i=len-1;i>=0;i--)
            printf("%d",a[i]);
    }
};
BT S,G,L;
int main() 
{
    S.read();
    G.read();
    L=S+G;
    L.write();
    return 0; 
}

(突然发现BT也是BianTai 啊,说出了我的心声