前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CF1619C Wrong Addition 题解

CF1619C Wrong Addition 题解

作者头像
Skykguj
发布2022-09-09 12:05:10
2830
发布2022-09-09 12:05:10
举报
文章被收录于专栏:Skykguj 's Blog

题意分析:

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

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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022 年 02 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意分析:
  • 加法代码
  • 减法代码
  • Code :
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档