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

 

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