1 条题解

  • 0
    @ 2025-8-24 21:26:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar yingxi
    没咋 || 最后在线时间:2025年8月21日10时55分

    搬运于2025-08-24 21:26:57,当前版本为作者最后更新于2025-07-21 10:21:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    看到 A+B Problem,大家是不是十分开心?但是他和这道题不同,仔细看,题目名称后面有一个“高精”,而 aabb 的范围竟然来到了 1050010^{500}!要知道,long long 在这道题里,只能通过 40%40\% 的数据,那我们用什么来存 aabb 呢?

    这就引入了我们的主题:高精度!aabb 我们可以拿字符串存储,然后一位一位的模拟加法。当然,要将字符转数字,需要将其 -'0', 例如这样:

    char c;
    cin >> c;
    cout << c - '0';
    

    这样就可以以数字的形式输出对应的字符啦。

    在处理之前,记得补前导零哦。就把两个字符串长度的较大值用一个变量存起来,比如 len,然后去看每个字符串的长度是否小于它,如果小于,说明要补前导零。

    int len = max(a.size(), b.size());
    while (a.size() < len) a = '0' + a;
    while (b.size() < len) b = '0' + b;
    

    补完前导零后,从低到高依次模拟计算过程。在这之中,要用一个变量存储上一位进的位,例如 jw。每一次做加法的时候,不仅要那当前这一位的两个数字,还要加上进位。

    int jw = 0;
    for (int i = len - 1; i >= 0; i--)
    {
        int t1 = a[i] - '0', t2 = b[i] - '0';
        int t = t1 + t2 + jw;
        jw = t / 10;
        t %= 10;
        char ch = t + '0';
        c = ch + c;
    }
    

    处理完之后,如果还有进位,就把前面直接加上一个 11,因为加法进位最多进 11。然后返回答案就可以了。

    if (jw != 0) return '1' + c;
    return c;
    

    好的这就是高精加啦,下面是完整代码:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    string add(string a, string b)
    {
        int len = max(a.size(), b.size()), jw = 0;
        string c = "";
        while (a.size() < len) a = '0' + a;
        while (b.size() < len) b = '0' + b;
        for (int i = len - 1; i >= 0; i--)
        {
            int t1 = a[i] - '0', t2 = b[i] - '0';
            int t = t1 + t2 + jw;
            jw = t / 10;
            t %= 10;
            char ch = t + '0';
            c = ch + c;
        }
        if (jw != 0) return '1' + c;
        return c;
    }
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	string s1, s2;
    	cin >> s1 >> s2;
    	cout << add(s1, s2);
        return 0;
    }
    
    • 1

    信息

    ID
    594
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    1
    已通过
    1
    上传者