题目链接
题目描述
给定两个正整数 和
,以及一个运算符
op
(+
, -
, *
, /
, ^
中的一个)。需要比较 A op B
和 B op A
的大小,并输出 >
, <
, 或 =
。
输入:
- 第一行一个整数
,表示数据组数。
- 接下来
行,每行包含两个正整数
和一个字符
op
。
输出:
- 对每组数据输出一个比较符号。
解题思路
这是一道分类讨论题,我们需要根据不同的运算符来分析其性质。
1. 加法 +
和 乘法 *
加法和乘法都满足交换律,即 且
。
因此,当运算符是
+
或 *
时,结果总是相等。
- 输出:
=
2. 减法 -
和 除法 /
减法和除法不满足交换律。
- 对于减法:
- 若
,则
且
,所以
。
- 若
,则
且
,所以
。
- 若
,则
且
,所以
。
- 若
- 对于除法(题目中的数都是正整数):
- 若
,则
且
,所以
。
- 若
,则
且
,所以
。
- 若
,则
且
,所以
。
- 若
可以发现,这两种运算的比较结果都等价于直接比较 和
的大小。
- 输出:根据
和
的大小关系输出
>
,<
, 或=
。
3. 乘方 ^
比较 和
的大小。由于
和
的值可能很大,直接计算会超出常规整数类型的表示范围,导致溢出。虽然使用对数函数是一种通用的方法,但它依赖于浮点数运算,可能存在精度问题。一个更稳健的方法是基于整数进行分类讨论。
通过分析函数 的性质,我们可以发现一些特殊情况和一般规律:
-
处理
的情况:显然
,结果为
=
。 -
处理包含
1
的情况:如果(且
),则
,结果为
<
。反之如果(且
),结果为
>
。 -
处理
的情况:
- 特例1:
{2, 3}
。比较和
。因为
,所以
。
- 特例2:
{2, 4}
。比较和
。因为
,所以
。
- 一般规律:对于不属于上述特例的所有整数对
,总有这样一个规律:较小的数作为底数时,幂次结果更大。即,若
,则
;若
,则
。
- 特例1:
这种方法完全避免了浮点数运算,使得结果更加精确可靠。
代码
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
void solve() {
long long a, b;
char op;
cin >> a >> b >> op;
if (op == '+' || op == '*') {
cout << "=" << endl;
} else if (op == '-' || op == '/') {
if (a > b) {
cout << ">" << endl;
} else if (a < b) {
cout << "<" << endl;
} else {
cout << "=" << endl;
}
} else if (op == '^') {
if (a == b) { cout << "=" << endl; }
else if (a == 1) { cout << "<" << endl; }
else if (b == 1) { cout << ">" << endl; }
else if ((a == 2 && b == 3) || (a == 3 && b == 2)) {
if (a < b) cout << "<" << endl; else cout << ">" << endl;
}
else if ((a == 2 && b == 4) || (a == 4 && b == 2)) { cout << "=" << endl; }
else if (a < b) { cout << ">" << endl; }
else { cout << "<" << endl; }
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
import java.util.Scanner;
import java.lang.Math;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
long a = sc.nextLong();
long b = sc.nextLong();
char op = sc.next().charAt(0);
if (op == '+' || op == '*') {
System.out.println("=");
} else if (op == '-' || op == '/') {
if (a > b) {
System.out.println(">");
} else if (a < b) {
System.out.println("<");
} else {
System.out.println("=");
}
} else if (op == '^') {
if (a == b) { System.out.println("="); }
else if (a == 1) { System.out.println("<"); }
else if (b == 1) { System.out.println(">"); }
else if ((a == 2 && b == 3) || (a == 3 && b == 2)) {
if (a < b) System.out.println("<"); else System.out.println(">");
}
else if ((a == 2 && b == 4) || (a == 4 && b == 2)) { System.out.println("="); }
else if (a < b) { System.out.println(">"); }
else { System.out.println("<"); }
}
}
}
}
import math
t = int(input())
for _ in range(t):
line = input().split()
a = int(line[0])
b = int(line[1])
op = line[2]
if op == '+' or op == '*':
print('=')
elif op == '-' or op == '/':
if a > b:
print('>')
elif a < b:
print('<')
else:
print('=')
elif op == '^':
if a == b:
print('=')
elif a == 1:
print('<')
elif b == 1:
print('>')
elif (a == 2 and b == 3) or (a == 3 and b == 2):
if a < b: print('<')
else: print('>')
elif (a == 2 and b == 4) or (a == 4 and b == 2):
print('=')
elif a < b:
print('>')
else:
print('<')
算法及复杂度
- 算法:数学 / 分类讨论
- 时间复杂度:对于每组测试数据,所有操作(包括对数计算)都是常数时间
的。总时间复杂度为
,其中
是数据组数。
- 空间复杂度: