CF1619C Wrong Addition 题解

2022-09-09 12:05:10 浏览数 (1)

题意分析:

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

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

加法代码

代码语言:javascript复制
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
}

减法代码

  • 若无解,则求出一个错误的结果。
代码语言:javascript复制
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 :

代码语言:javascript复制
#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;
}
ode

0 人点赞