题意分析:

现在定义一种新的加法运算,每一位相加直接写到左侧,不进位,例如:

$17236 +3465$ 会被写成这样:

算出 $6+5=11$,在答案中写入 $11$。
算出 $3+6=9$,并将结果写到答案的左侧得到 $911$。
算出 $2+4=6$,并将结果写到答案的左侧得到 $6911$。
算出 $7+3=10$, 并将结果写在答案的左侧得到 $106911$。
算出 $1+0=1$,并将结果写到答案的左侧得到 $1106911$。

所以得到 $17236 +3465 = 1106911$。

告诉你 $a, c$,请你回答一个 $b$ 使得 $a + b = c$。

我的想法是定义一种新的减法运算,是加法运算的逆运算,算出 $c - a$ 的结果 $res$,如果 $c = plus(a, res)$,输出 $res$ 否则输出 $-1$。

加法代码

long long plus (long long res, long long sub)
{
    std::vector <int> tmp;
    std::string ansstr;
    long long maxn = std::max(res, sub);
    while (maxn > 0)
    {
        tmp.insert(tmp.begin(), sub % 10 + res % 10); // 将每两位结果求出
        sub /= 10, maxn /= 10, res /= 10;
    }
    for (int i = 0; i < tmp.size(); i++) ansstr += std::to_string(tmp[i]); // 合并为字符串
    return std::atoll(ansstr.c_str()); // 转为 int
}

减法代码

  • 若无解,则求出一个错误的结果。
while (after > 0)
{
    bsub = after % 10; after /= 10;
    sub = before % 10; before /= 10;
    if (sub > bsub) 
    {
        if (bsub == 0) bsub = after % 10 * 10;
        else bsub = bsub + after % 10 * 10;
        after /= 10;
    }
    ans.insert(ans.begin(), bsub - sub);
}

if (ans.front() == 0) ans.erase(ans.begin());
long long res = 0;
for (int i = 0; i < ans.size(); i++) { res += ans[i]; res *= 10; }
res /= 10;

Code :

#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>

std::vector <short int> ans;
long long t, before, after;

long long plus (long long res, long long sub)
{
    std::vector <int> tmp;
    std::string ansstr;
    long long maxn = std::max(res, sub);
    while (maxn > 0)
    {
        tmp.insert(tmp.begin(), sub % 10 + res % 10);
        sub /= 10, maxn /= 10, res /= 10;
    }
    for (int i = 0; i < tmp.size(); i++) ansstr += std::to_string(tmp[i]);
    return std::atoll(ansstr.c_str());
}

int main()
{
    std::cin >> t;

    while (t--)
    {
        long long bsub = 0, sub = 0, tb, ta;
        std::cin >> before >> after;
        
        // before 加法运算之前的数,即减数,after 同理,为被减数。
        
        tb = before, ta = after; // 备份减数和被减数,后面运算会改变 before 和 after。

        while (after > 0)
        {
            bsub = after % 10; after /= 10;
            sub = before % 10; before /= 10;
            if (sub > bsub) 
            {
                if (bsub == 0) bsub = after % 10 * 10;
                else bsub = bsub + after % 10 * 10;
                after /= 10;
            }
            //std::cout << bsub << '-' << sub << std::endl;
            ans.insert(ans.begin(), bsub - sub);
        }

        if (ans.front() == 0) ans.erase(ans.begin());
        long long res = 0;
        for (int i = 0; i < ans.size(); i++) { res += ans[i]; res *= 10; }
        res /= 10;
        if (plus (res, tb) != ta) res = -1; // 若无解,输出 -1。
        while(!ans.empty()) { ans.erase(ans.begin()); } // 每一轮回答后要清空 ans。
        std::cout << res << std::endl;
    }
    return 0;
}
最后修改:2022 年 02 月 02 日
赠人玫瑰,手有余香。您的赞赏是对我最大的支持!