0
点赞
收藏
分享

微信扫一扫

Codeforces 1619C Wrong Addition

jjt二向箔 2022-02-19 阅读 71
数据结构

题目大意:

对于题面中给的例子 17236 + 03465 = 1106911

/*

17236 + 03465 = 1106911

 1  7 2 3  6
+0  3 4 6  5
 -----------
 1 10 6 9 11

*/

两个数中每一位直接相加,结果直接写在相应位置

假设A = 17236, B = 3456, C = 1106911, 题目会给A和C,求B的值或输出-1当B无法计算时


看到大部分题解都在用字符串,但是这道题的数据范围是1 \leq A < S \leq 10^{18},S只有10^{18}而且S-A一定小于S,因此可以用64位无符号整数做运算。

关于-1的处理:

可以发现结果是由A和B的一位相加得到,那么,当用C的一位减A的一位不够,用C的两位减A的一位超过9时,可以认为无法算出一个一位的结果作为B的一位,那么此时为-1


代码:

#include <iostream>

#define QWORD unsigned long long

int main()
{
	int T;
	std::cin >> T;
	while (T--)
	{
		QWORD A, S;
		std::cin >> A >> S;
		QWORD ans = 0;
		QWORD zero = 1;
		int flag = 1;
		while (S || A)
		{
			int sx = (int)(S % 10);
			int ax = (int)(A % 10);
			S /= 10;
			A /= 10;
			if (sx < ax)
			{
				sx += (int)(10 * (S % 10));
				S /= 10;
			}
			int c = sx - ax;
			if (c > 9 || c < 0)
			{
				flag = 0;
				break;
			}
			ans += zero * c;
			zero *= 10;
		}
		flag ? std::cout << ans << std::endl : std::cout << -1 << std::endl;
	}
	return 0;
}
举报

相关推荐

0 条评论