题意分析:
现在定义一种新的加法运算,每一位相加直接写到左侧,不进位,例如:
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
}
减法代码
- 若无解,则求出一个错误的结果。
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;
}