C++字符串数字的比较

来源:互联网 发布:union软件安卓 编辑:程序博客网 时间:2024/04/20 20:05

假设:

有这么一个字符串集合,"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

 

0 0
原创粉丝点击