# 去掉開頭數字_阿拉伯數字轉漢字
阿新 • • 發佈:2021-02-08
技術標籤:# 去掉開頭數字
最近看到一個筆試題,阿拉伯數字和漢字數字的互相轉化,網上比較多的是python和java的實現,這裡對C++的實現做了整理和改動。
要實現的功能是將正整數轉成漢字數字,忽略小數部分(小數部分就是一對一的對映,也比較容易實現)。例如這幾個測試用例:
18->十八
180->一百八十
20930->兩萬零九百三十
129809->十二萬九千八百零九
200182190->二億零一十八萬二千一百九十
觀察發現與一一對應的不同之處在於,我們用漢字稱呼時要加上單位和省略多處零,並且每萬位會迴圈從千開始稱呼,例如:
12301230 =>一千二百三十萬一千二百三十
而不是被叫做一千萬二百萬三十萬 一千二百三十
實現以上功能的完整C++如下(詳解見註釋)
#include
#include
usingnamespacestd;
stringAA[]={"零","一","二","三","四","五","六","七","八","九","十"};
stringBB[]={"","十","百","千","萬","十萬","百萬","千萬","億"};
stringNumberToChinese1(intnum){
stringres="";
stringnumstr=to_string(num);/*to_string函式轉成字串,可自動去掉00123前面的00*/
intk=numstr.length();
for(inti=0;i{
inttmp=numstr[i]-'0';//得到每位的數字的大小
intbIndex=k-i-1;//得到從個位算起的位數個數
//cout</*先處理該位數是0的情況,如果發現一位數是0,如果是在個位,或者它後面一位也是0,就不新增漢字零
比如10020,讀作一萬零二十,而不是一萬零零二十零*/if(0==tmp)
{//cout<//cout<//cout</*每萬位的漢字計數規則會重複一下,例如12301230一千二百三十萬一千二百三十,每萬位的最低位不加零,但加上一個萬級單位*/if(bIndex>=4&&0==bIndex%4)
res=res+BB[bIndex];/*中間重複的0或者是0個位就跳過加零*/elseif(('0'==numstr[i+1]&&i-1)||i==numstr.length()-1)continue;else/*如果不是以上情況,0對應漢字位置加個零字元AA[0]*/
res=res+AA[tmp];//cout<
}else
{/*對於該位數非0,正常新增對應漢字數字*/
res=res+AA[tmp];//cout</*對於最開頭會被稱作十幾的數字,如果除萬後餘兩位,並且1開頭,在從左數第一位的時候刪掉十位的漢字一,常讀作十幾而不是一十幾*/if(k%4==2&&numstr[0]=='1'&&i==0)
{
res.erase(0);/*刪掉第0個字元*/
}if(0==bIndex%4)/*對於非零的位置,也要看是否是每萬位,是的話要加上"萬","億"*/
res=res+BB[bIndex];else
{
res=res+BB[bIndex%4];/*對每萬位以內的數字,每萬位以內正常新增“十”,“千”,“百”的單位,即位數取4的餘數對應的單位*/
}//cout<
}
}returnres;
}intmain(){/*int型別在C語言中佔4個字bai節,即32個二進位制位,-2^31~2^31-1=最大值2147483647
如需擴充套件的話可用longlong是雙精度整數,佔用8個位元組,範圍-1.7*10負308次方~1.7*10的308次方*/intm;while(cin>>m)/*輸入一個int型範圍內的正整數m*/
{if(0==m)
{cout<"零"<endl;
}else
{stringChineseStr="";
ChineseStr=NumberToChinese1(m);cout<endl;
}
}
system("pause");return0;
}
測試結果如下