1082 Read Number in Chinese

万和亿两个单位都是只出现一次的,所以可以分解为每四位读一次,然后在间隔处加上万和亿。

读四位的注意点:
1.如果有高位存在,开头的零要读,否则不读。
2.中间的多个零只读一次。
3.结尾的零不读
4.全零的话返回“”,即不读。

超过四位的情况:
1.小于8位,补0到8位,先读高四位(存在高位标志位为0),加“Wan”,再读低位(存在高位标志位为1)。
2.大于8为,即9位。补0到12位,先读包含亿的最高四位(存在高位标志位为0),加"Yi",再读包含万的四位和最低四位,存在高位标志都为1,中间加“Wan”。

输入为0
此时结果字符串为空,进行特殊处理。

# include <iostream>
#include<string>
using namespace std;

const string num[] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
const string m_exp[] = {"Qian" ,"Bai" ,"Shi", ""};
string read4(string s, bool over4) {
	string rv;
	bool isfirst = true;
	int r = 3, L = 0;
	while (r >= 0 && s[r] == '0') --r;
	if (r < 0) return "";
	while (L <= r && s[L] == '0') ++L;
	if (L != 0 && over4) rv = num[0] + " ";
	for (int i = L; i <= r; ++i) {
		if(s[i]!='0') rv += num[s[i] - '0'] + " " + m_exp[i] + " ";
		if (s[i] == '0' && isfirst) {
			rv += num[0] + " ";
			isfirst = false;
		}
	}
	while (*(rv.end() - 1) == ' ') rv.erase(rv.end() - 1);
	return rv;
}
int main()
{
		string s, ans;
		cin >> s;
		if (s[0] == '-') {
			ans += "Fu ";
			s = s.substr(1, s.size() - 1);
		}
		if (s.size() > 8) {
			s = string(3, '0') + s;
			if (read4(s.substr(0, 4), false) != "") ans += read4(s.substr(0, 4), false) + " Yi ";
			if (read4(s.substr(4, 4), true) != "") ans += read4(s.substr(4, 4), true) + " Wan ";
			ans += read4(s.substr(8, 4), true);
		}
		else if (s.size() > 4) {
			s = string(8 - s.size(), '0') + s;
			if (read4(s.substr(0, 4), false) != "") ans += read4(s.substr(0, 4), false) + " Wan ";
			ans += read4(s.substr(4, 4), true);
		}
		else {
			s = string(4 - s.size(), '0') + s;
			ans += read4(s.substr(0, 4), false);
		}
		if (!ans.size()) ans += num[0];
		while (*(ans.end() - 1) == ' ') ans.erase(ans.end() - 1);
		cout << ans;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值