C++字串數字的比較
阿新 • • 發佈:2019-01-09
假設:
有這麼一個字串集合,"1","2","3",........."10000000", "40","20".
要求進行排序。
基本想法: 把字串轉化為數字,進行對比。
但是有一個問題:也許這個字串的長度超過了 普通整數的範圍了,怎麼辦? 有人說用 long long ,可以,但不優雅,而且無法對更加大的數字進行排序。
解決方法: 使用大數的思想。程式碼如下;
#include <iostream> #include <functional> #include <map> #include <string> #include <vector> #include <iterator> #include <algorithm> #include <utility> #include <cassert> using namespace std; struct string_Intnumber_checker{ bool operator()(const string& str) const{ if(!str.empty()) { if(string::npos == str.find_first_not_of("0123456789")) { return true; } } return false; } }; struct string_Intnumber_cmp{ bool operator()(const string& x, const string& y) const{ string_Intnumber_checker checker; assert(checker(x)); assert(checker(y)); if(x.length() > y.length()) { return false; } else if(x.length() == y.length()) { int len = x.length() - 1; while(x[len] == y[len] && x.length() >= 0) len--; if(len >= 0 && x[len] > y[len]) return false; else return true; } else { return true; } } }; int main() { vector<string> strVec = {"111111119999999999800008888888888888888888","1", "9", "20", "7", "40"}; sort(strVec.begin(), strVec.end(), string_Intnumber_cmp()); copy(strVec.begin(), strVec.end(), ostream_iterator<string>(cout,"\n")); }
結果如下:
1
7
9
20
40
111111119999999999800008888888888888888888