給定一個數值,輸出符合中國人習慣的讀法--記一道筆試題

題目:給定一個數字,最大小於一萬億,輸出符合中國人習慣的讀法,例如:ios

  a、12輸出:十二ide

  b、102輸出:一百零二spa

  c、1002輸出:一千零二翻譯

  d、112輸出:一百十二code

  e、10112輸出:一萬零一百十二blog

  f、120000000:一億二千萬input

  g、11021002:一千一百零二萬一千零二string

  h、11020102:一千一百零二萬零一百零二it

  i、1000001:一百萬零一io

  j、1000000001:十億零一

  嗯,一道筆試題,解的很沒有節操,沒有太好的思路,只能盡力抽取翻譯過程當中的共有代碼,儘可能寫的不那麼難看。

  基本思路就是把輸入的數補全爲12位,而後三等分,分別轉換計算,而後拼接起來。

  PS:感受中文語言坑比較多,越寫越醜。

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 
  5 //判斷該位置後是否還有非零數 
  6 bool NoPosAfter(std::string str, int index)
  7 {
  8     int len = str.size();
  9     for(int i = index+1; i < len; ++i)
 10     {
 11         if(str[i] != '0')return false;
 12     }
 13     return true;
 14 }
 15  
 16 std::string convert(std::string str)
 17 {
 18     std::vector<std::string> unit{"", "", "", ""};
 19     std::vector<std::string> num{"", "", "", "", "", "", "", "", "", ""};
 20 
 21     std::string ret("");
 22 
 23     int i = 0;
 24     while(i < 4 && str[i] == '0') ++i;
 25     if(i == 4) return ret;
 26     while(i < 4)
 27     {
 28         if(str[i] == '0')
 29         {
 30             if(NoPosAfter(str, i))
 31             {
 32                 return ret;
 33             }
 34             else
 35             {
 36                 if(i > 0)
 37                     if(str[i-1] != '0')
 38                         ret += "";
 39             }
 40         }
 41         else
 42         {
 43             ret += num[str[i]-'0'] + unit[3-i];
 44         }
 45         ++i;
 46     }
 47 
 48     return ret;
 49 }
 50 
 51 void print(std::string input)
 52 {
 53     std::string cstr(12, '0');
 54     cstr.replace(12-input.size(), input.size(), input);
 55 
 56     std::string Ystr(cstr, 0, 4);
 57     std::string Wstr(cstr, 4, 4);
 58     std::string Lstr(cstr, 8, 4);
 59 
 60     std::string result;
 61 
 62     auto Yret = convert(Ystr);
 63     auto Wret = convert(Wstr);
 64     auto Lret = convert(Lstr);
 65 
 66     bool high = false;//高位標誌 
 67     if(Yret.size() != 0)
 68     {
 69         result += Yret + "";
 70         high = true;
 71     }
 72     
 73     if(Wret.size() != 0)
 74     {
 75         if(Wstr < "1000" && high) result += "";
 76         result += Wret + "";
 77         high = true;
 78     }
 79     else if(Lret.size() != 0)
 80     {
 81         if(high)result += "";
 82     }
 83     
 84     if(Lret.size() != 0)
 85     {
 86         if(Lstr < "1000" && high && Wret.size()) result += "";
 87         result += Lret;
 88     }
 89 
 90     if(result.find("一十") == 0)
 91     {
 92         result.erase(0, 2);
 93     }
 94     
 95     std::cout << result << std::endl;
 96 }
 97 
 98 int main()
 99 {
100     print("112");
101     print("10112");
102     print("120000000");
103     print("11021002");
104     print("11020102");
105     print("1000001");
106 
107     return 0;
108 }
View Code
相關文章
相關標籤/搜索