阿拉伯數字轉換爲漢語表達方式

漢語博大精深,本問題要寫一個函數將一個簡單的阿拉伯數字轉換爲漢語中的讀法。比如 1980,要轉換爲“一千九百八十”;198 要轉換爲“一百九十八”;19 要轉換爲“十九”等等。這屬於細節處理問題。

特殊用例:
1、注意0的出現。1080、1008、1800、10000、1000000、100000000。
2、如果某個大權值內的四位都是0,比如100000500,那麼不要這個大權值。
3、190000 一般讀作“十九萬” 而不是“一十九萬”。這個情況最特殊。

數值:零一二三四五六七八九
小權值:十 百 千 
大權值:萬 億

方法:
從右向左依次判斷每個十進制位的數值(0~9)和小權值(十百千)。每四位結算一次並加入大權值(萬億)。

//暫時沒有處理上面說的第三者特殊情況。
#include<iostream>
#include<string>
#include<vector>
using namespace std;

string transfer(int n)
{
    string result;
    vector<string> value = {"零","一", "二", "三","四", "五", "六", "七", "八", "九" };
    vector<string> cost1 = {"", "十", "百" ,"千"};
    vector<string> cost2 = {"", "", "萬", "億"};
    
    if(n == 0)
        return value[0];
    int i, k;
    string v, c1, c2, fourstr;
    bool last0 = false;
    bool tail0 = true;
    bool all0 = true;
    i = 0;
    
    while(n!=0)
    {
        k = n%10;
        v = value[k];
        c1 = cost1[i%4];
        
        if(i % 4 == 0) //每四位纔出現一次
        {
            c2 = (all0==true) ? "" : cost2[i/4];
            result = fourstr + c2 + result;
            fourstr = "";
            all0 = true;
        }
    
        if(k != 0) //非0
        {
            fourstr = v + c1 + fourstr;
            tail0 = false;
            all0 = false;
        }
        else //是0
        {
            if(last0 || tail0)
            {
                //連續的0,或者末尾的0
            }
            else //單獨的0
            {
                fourstr = v + fourstr;
                last0 = true;
            }
        }
        //記得一定要自增~
        i++;
        n /= 10;
    }
    
    i--;
    c2 = cost2[i/4+1];
    result = fourstr + c2 +result;
    return result;
}

int main()
{
    int n;
    while(cin>>n)
        cout<<transfer(n)<<endl;
    return 1;
}
上面代碼是我自己測試的,沒有經過哪個OJ系統的測試,因此絕對正確性還沒能證實。希望各位來找茬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章