給定兩個等長數字字串 str1、str2(長度可能超過 64 位),不使用大整數庫,如何判斷大小?
if (str1[i] > str2[i]) return 1; else if (str1[i] < str2[i]) return -1;int compareNumericString(const string& a, const string& b) {
// 1. 去前導零
size_t i = 0, j = 0;
while (i < a.size() && a[i] == '0') ++i;
while (j < b.size() && b[j] == '0') ++j;
string sa = a.substr(i), sb = b.substr(j);
// 2. 比長度
if (sa.size() != sb.size()) return sa.size() > sb.size() ? 1 : -1;
// 3. 逐字元比較
for (size_t k = 0; k < sa.size(); ++k) {
if (sa[k] != sb[k]) return sa[k] > sb[k] ? 1 : -1;
}
return 0;
}
std::sort(vec.begin(), vec.end(), compareNumericString)。ORDER BY LENGTH(col), col 同理。掌握「等長字典序 = 數值序」這一數學性質,即可在不支援大整數的環境下高效比較任意長度數字字串。