top1编程
← 返回题目
题解

比大小

1 条题解

  • 0
    @ 2026-8-5 10:29:40

    解题思路

    这个题最大的"陷阱"是数特别大:最多可以有100位!100位的整数比地球上的人口数量还大得多得多。而 long long 这种数据类型能装下的最大整数大约只有19位,根本装不下。所以我们要换一种存数的方法——用字符串(string)来存,就像用笔在纸上写数字一样,写多长都行。

    比大小的规则大家都懂,我们把它翻译成"电脑能听懂"的步骤:

    1. 去掉前导0。比如"007"其实就等于"7"。先把两个数前面多余的0都去掉,否则会干扰后面的比较(比如"007"和"70",不去掉0的话"007"有3位,会被错误地当成更大的数)。
    2. 比位数。位数多的数一定更大,比如100比99大。如果两个数位数不一样,位数多的那个就是答案。
    3. 位数一样,就从头一位一位比。第一位的数字谁大,整个数就大;第一位一样就看第二位……在C++里,两个长度相同的字符串直接比"大小"(字典序),正好就是一位一位地比数字,结果和数学里比大小完全一致。
    4. 找到大的那个,原样输出。

    参考代码

    // 比大小:两个正整数(最多100位)比大小,输出较大的那个
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        string a,b;
        cin>>a>>b;
        // 去掉前导的0(例如"007"->"7"),避免影响位数比较
        while(a.size()>1&&a[0]=='0') a.erase(0,1);
        while(b.size()>1&&b[0]=='0') b.erase(0,1);
        // 先比位数:位数多的数更大
        if(a.size()!=b.size()){
            cout<<(a.size()>b.size()?a:b)<<'\n';
            return 0;
        }
        // 位数相同时,从高位开始一位一位比(字典序即数字大小)
        cout<<(a>b?a:b)<<'\n';
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(L),其中 L 是两个数中较长的位数(最多100位)。我们只是把字符串从头到尾比一遍,非常快。
    • 空间复杂度:O(L),用来存两个字符串。
    • 1