題目:click me~
題意:輸入一個數字,要求輸出中文讀數字的拼音。
解題思路:
1.分成3節(億節,萬節,個節)每節的讀音相同:x千xx十x,每輸出一節後加上億/萬(個節省略)。
2.零的輸出:在數字的某節中,某個非零位(該節千位除外)的高位爲零,那麼需要在該非零位前額外發音一個零。例如:
3030三千零三十;10003一萬零三;30003000三千萬三千(沒有額外的零)。
可以用一個flag來判斷是否存在累積的零。
code:
#include<iostream>
#include<string>
using namespace std;
int main(){
string num[12]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string c[6]={"Ge","Shi","Bai","Qian","Yi","Wan"};
int J[]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
int n;
cin>>n;
int part[3];
if(n==0){
cout<<"ling";
return 0;
}
if(n<0){
cout<<"Fu ";
n=-n;
}
part[0]=n/100000000;
part[1]=(n%100000000)/10000;
part[2]=n%10000;
bool zero=false;//是否在非零數前輸出合適的ling
int p=0;//用於維護單詞前沒有空格,之後輸入的單詞都在前面加一個空格。
for(int i=0;i<3;i++){
int temp=part[i];//三個部分,每部分命名規則一樣,都是x千x百x十x。
for(int j=3;j>=0;j--){
int curpos=8-i*4+j;//當前數字的位置
if(curpos>=9)continue;//最多九位數
int cur=(temp/J[j])%10;//取出當前數字
if(cur!=0){
if(zero){
p++==0?cout<<"ling":cout<<" ling";
zero=false;
}
if(j==0){
p++==0?cout<<num[cur]:cout<<" "<<num[cur];
}else{
p++==0?cout<<num[cur]<<" "<<c[j]:cout<<" "<<num[cur]<<" "<<c[j];
}
}else if(!zero&&j!=0&&n/J[curpos]>=10)zero=true;
}
if(i!=2&&part[i]>0)cout<<" "<<c[i+4];//處理完每部分後,最後輸出單位,Yi/Wan
}
return 0;
}