题意分析:
现在定义一种新的加法运算,每一位相加直接写到左侧,不进位,例如:
$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;
}