洛谷【P1601】A+B Problem(高精)

题目传送门:https://www.luogu.org/problemnew/show/P1601

高精度加法板子。我们灵性地回忆一波小学学加法列竖式的场景(从\(6\)岁开始口算从未打过草稿的大佬请出门左转)。

我们用\(a\)\(b\)数组存加数,\(c\)数组存和。根据加法法则,\(c[i]=a[i]+b[i]\),如果\(c[i]>10\)就要进位。

然后再存一下每一个数的长度就可以了。建议用结构体,因为结构体重载运算符很舒服。

时间复杂度:\(O(len)\)

空间复杂度:\(O(len)\)

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

char s[505];

struct Bignum {
    int num[505];

    void make() {
        num[0]=strlen(s+1);//num[0]存长度,num[1]存个位数,num[2]存十位数...
        for(int i=1;i<=num[0];i++)
            num[i]=s[num[0]-i+1]-'0';//跟快读一样处理字符
    }

    Bignum operator+(const Bignum &fake)const {
        Bignum c;memset(c.num,0,sizeof(c.num));//记得要memset,不然就挂飞了
        c.num[0]=max(num[0],fake.num[0]);//更新长度
        for(int i=1;i<=c.num[0];i++) {
            c.num[i]+=num[i]+fake.num[i];
            c.num[i+1]+=c.num[i]/10;c.num[i]%=10;//记得是+=不是=
        }
        if(c.num[c.num[0]+1])c.num[0]++;//如果进位进到下一位去了那就长度++
        return c;//由于最多是三个一位数相加,所以不可能加出三位数,所以只要一个if就可以了
    }

    void print() {
        for(int i=num[0];i;i--)
            printf("%d",num[i]);
    }
}a,b,c;

int main() {
    scanf("%s",s+1);a.make();
    scanf("%s",s+1);b.make();//以字符串的形式读入再转化到数组里。
    c=a+b;c.print();//重载运算符后直接输出
    return 0;
}
posted @ 2018-09-29 11:04  AKMer  阅读(278)  评论(0编辑  收藏  举报