题解
比大小
1 条题解
-
0
解题思路
这个题最大的"陷阱"是数特别大:最多可以有100位!100位的整数比地球上的人口数量还大得多得多。而 long long 这种数据类型能装下的最大整数大约只有19位,根本装不下。所以我们要换一种存数的方法——用字符串(string)来存,就像用笔在纸上写数字一样,写多长都行。
比大小的规则大家都懂,我们把它翻译成"电脑能听懂"的步骤:
- 去掉前导0。比如"007"其实就等于"7"。先把两个数前面多余的0都去掉,否则会干扰后面的比较(比如"007"和"70",不去掉0的话"007"有3位,会被错误地当成更大的数)。
- 比位数。位数多的数一定更大,比如100比99大。如果两个数位数不一样,位数多的那个就是答案。
- 位数一样,就从头一位一位比。第一位的数字谁大,整个数就大;第一位一样就看第二位……在C++里,两个长度相同的字符串直接比"大小"(字典序),正好就是一位一位地比数字,结果和数学里比大小完全一致。
- 找到大的那个,原样输出。
参考代码
// 比大小:两个正整数(最多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