Educational Codeforces Round 118 (Rated for Div. 2) A. Long Comparison

发布时间 2023-09-16 02:27:19作者: zsxuan

白板上左右写上两个数,每个字的形式表示为:一个正整数 \(x\)\(p\) 个末尾 \(0\)
询问左右两个数的大小关系。

假设左边为 \(x_1, p_1\) ,右边为 \(x_2, p_2\)

先看数位长度

  • \(dig_{x_1} + p_1 < dig_{x_2} + p_2\) ,则关系为 \(<\)
  • \(dig_{x_1} + p_1 > dig_{x_2} + p_2\) ,则关系为 \(>\)

否则,数位长度相等,可以使用字典序比较。不妨拆分 \(x_1, x_2\) 的数位,对 \(x_1, x_2\) 补末尾 \(0\) 到数位为 \(max_{x_1.length, x_2.length}\) 。从左往右扫。

  • \(x_1[i] > x_2[i]\) ,则 \(>\) ,终止循环。
  • \(x_1[i] < x_2[i]\) ,则 \(<\) ,终止循环。
  • 未层终止循环则 \(=\)
view
#include <bits/stdc++.h>
void solve() {
	int x1, p1; std::cin >> x1 >> p1;
	int x2, p2; std::cin >> x2 >> p2;
	auto get_digt = [&](int x) {
		int cnt = 0;
		while (x) {cnt++;x/=10;}
		return cnt;
	};
	if (get_digt(x1) + p1 > get_digt(x2) + p2) std::cout << ">" << '\n';
	else if (get_digt(x1) + p1 < get_digt(x2) + p2) std::cout << "<" << '\n';
	else {
		std::vector<int> d1, d2;
		while (x1) {
			d1.push_back(x1 % 10);
			x1 /= 10;
		}
		std::reverse(d1.begin(),d1.end());
		while (x2) {
			d2.push_back(x2 % 10);
			x2 /= 10;
		}
		std::reverse(d2.begin(),d2.end());
		while (d1.size() < d2.size()) d1.push_back(0);
		while (d2.size() < d1.size()) d2.push_back(0);
		int m = d1.size();
		for (int i = 0; i < m; i++) {
			if (d1[i] < d2[i]) {
				std::cout << "<" << '\n';
				return;
			}
			else if (d1[i] > d2[i]) {
				std::cout << ">" << '\n';
				return;
			}
		}
		std::cout << "=" << '\n';
	}
}
signed main() {
    int _ = 1; std::cin >> _;
    while (_--) solve();
	return 0;
}