如何比较长度≥100的数字字符串?stoi/stoll触发溢出错误
超长数字字符串比较方案
当数字字符串长度超过stoll等函数的处理范围时,直接转整数会触发溢出错误,此时可以通过字符串本身的特性来比较大小,步骤如下:
核心逻辑
- 先比长度:对于无符号的数字字符串,长度更长的对应数字更大。比如长度101的字符串肯定比长度100的大。
- 长度相同则逐位对比:从左到右依次比较每个位置的字符,第一个出现差异的位置上,字符ASCII值更大的那个数字字符串对应的数值更大。
额外边界处理
如果字符串存在前导零(比如"00012345..."),需要先去除前导零再执行上述比较逻辑。注意如果字符串全是零(比如"0000"),处理后要保留一个"0"。
C++示例代码
#include <string> #include <algorithm> // 去除前导零 std::string trimLeadingZeros(const std::string& s) { size_t start = s.find_first_not_of('0'); if (start == std::string::npos) { return "0"; // 全零情况 } return s.substr(start); } // 比较两个超长数字字符串,返回值:1表示str1>str2,-1表示str1<str2,0表示相等 int compareBigNumberStrings(std::string str1, std::string str2) { // 先处理前导零 str1 = trimLeadingZeros(str1); str2 = trimLeadingZeros(str2); // 比较长度 if (str1.length() > str2.length()) { return 1; } else if (str1.length() < str2.length()) { return -1; } else { // 长度相同,逐位比较 for (size_t i = 0; i < str1.length(); ++i) { if (str1[i] > str2[i]) { return 1; } else if (str1[i] < str2[i]) { return -1; } } return 0; // 所有位都相同 } }
内容的提问来源于stack exchange,提问作者Ankit Pathak
相关产品推荐
相关产品推荐

