pat 1082 Read Number in Chinese

Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu". Note: zero ("ling") must be handled correctly according to the Chinese tradition. For example, 100800 is "yi Shi Wan ling ba Bai".

Input Specification:

Each input file contains one test case, which gives an integer with no more than 9 digits.

Output Specification:

For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.

Sample Input 1:
-123456789
Sample Output 1:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Input 2:
100800
Sample Output 2:
yi Shi Wan ling ba Bai

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

vector<int> vec;
map<int, string> num2name;
map<int, string> bit2name;

string ans="";

void outPut(int istart, int iend, bool flag) {
	bool zeros = false;
	
	int cnt = 0;
	if (istart-iend>=3) 
		cnt = 4;
	else cnt = istart - iend + 1;

	for (int i = istart; i >= iend; --i)
	{
		if (vec[i] == 0) {
			zeros = true;
			cnt--;
			continue;
		}

		if(vec[i] >= 1 && vec[i] <= 9) {
			if(zeros) {
				//cout << " ling";
				ans += " ling";	
			}
			if(flag == false)
				//cout << " " << num2name[vec[i]] << " " << bit2name[cnt];
				ans += (" "+num2name[vec[i]] + " " + bit2name[cnt]); 
			else {
				//cout << num2name[vec[i]] << " " << bit2name[cnt];
				ans += (num2name[vec[i]] + " " + bit2name[cnt]); 
				flag = false;
			}
			
			zeros = false;
		}

		cnt--;
	}
}
int main() {
	int n;
	cin >> n;
	ans = "";

	num2name[0] = "ling"; num2name[1]="yi"; num2name[2]="er";num2name[3]="san";
	num2name[4]="si"; num2name[5]="wu"; num2name[6]="liu"; num2name[7]="qi";
	num2name[8]="ba"; num2name[9] = "jiu";

	bit2name[2]="Shi"; bit2name[3]="Bai"; bit2name[4]="Qian"; bit2name[5]="Wan";
	bit2name[9]="Yi"; bit2name[1]="";
	if (n == 0) ans = "ling";
	if (n < 0) {
		n = -n;
		ans += "Fu ";
	}

	int cnt = 10;

	while(n != 0) {
		int tmp = n%cnt;
		vec.push_back(tmp);
		n = n/10;
	}
	
	//reverse(vec.begin(), vec.end());

	if(vec.size() >= 9) {
		ans += num2name[vec[vec.size()-1]];
		//cout << " Yi";
		ans += " Yi";
		outPut(7, 4, false);
		//cout << "Wan";
		int len = ans.size()-1;
		if (ans[len] == ' ')
			ans += "Wan";
		else
			ans += " Wan";
		outPut(3,0, false);
	} else if (vec.size() > 4) {
		outPut(vec.size()-1, 4, true);
		int len = ans.size()-1;
		if (ans[len] == ' ')
			ans += "Wan";
		else
			ans += " Wan";
		outPut(3,0, false);
	} else {
		outPut(vec.size()-1, 0, true);
	}
	
	if(ans[ans.size()-1] == ' ')
		cout << ans.substr(0, ans.size()-1) << endl;
	else cout << ans << endl;
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值