题目链接

数学题

题目描述

给定两个正整数 ,以及一个运算符 op+, -, *, /, ^ 中的一个)。需要比较 A op BB op A 的大小,并输出 >, <, 或 =

输入:

  • 第一行一个整数 ,表示数据组数。
  • 接下来 行,每行包含两个正整数 和一个字符 op

输出:

  • 对每组数据输出一个比较符号。

解题思路

这是一道分类讨论题,我们需要根据不同的运算符来分析其性质。

1. 加法 + 和 乘法 *

加法和乘法都满足交换律,即 。 因此,当运算符是 +* 时,结果总是相等。

  • 输出=

2. 减法 - 和 除法 /

减法和除法不满足交换律。

  • 对于减法:
    • ,则 ,所以
    • ,则 ,所以
    • ,则 ,所以
  • 对于除法(题目中的数都是正整数):
    • ,则 ,所以
    • ,则 ,所以
    • ,则 ,所以

可以发现,这两种运算的比较结果都等价于直接比较 的大小。

  • 输出:根据 的大小关系输出 >, <, 或 =

3. 乘方 ^

比较 的大小。由于 的值可能很大,直接计算会超出常规整数类型的表示范围,导致溢出。虽然使用对数函数是一种通用的方法,但它依赖于浮点数运算,可能存在精度问题。一个更稳健的方法是基于整数进行分类讨论。

通过分析函数 的性质,我们可以发现一些特殊情况和一般规律:

  1. 处理 的情况:显然 ,结果为 =

  2. 处理包含 1 的情况:如果 (且 ),则 ,结果为 <。反之如果 (且 ),结果为 >

  3. 处理 的情况

    • 特例1:{2, 3}。比较 。因为 ,所以
    • 特例2:{2, 4}。比较 。因为 ,所以
    • 一般规律:对于不属于上述特例的所有整数对 ,总有这样一个规律:较小的数作为底数时,幂次结果更大。即,若 ,则 ;若 ,则

这种方法完全避免了浮点数运算,使得结果更加精确可靠。

代码

#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('<')

算法及复杂度

  • 算法:数学 / 分类讨论
  • 时间复杂度:对于每组测试数据,所有操作(包括对数计算)都是常数时间 的。总时间复杂度为 ,其中 是数据组数。
  • 空间复杂度: