PTA A1082 Read Numer in Chinese(25分)

題目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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章