1082. Read Number in Chinese 解析

给一个数字要用中文读出。

主要还是单位的判定和零的读法。

例如:

10000000 这样的读 yi Yi 不用读万

10080 这样的度yi Wan ling ba Shi 只读一个零 而且后面的0不读。

8001000 这样的度ba Bai Wan yi Qian后面的零不读。

所以我们主要是4位为一个处理但愿进行处理,和标记位的更新。用len确定现在的位数,来添加单位。

……………………更新线…………………………

case 4: 23508

#include <iostream>
#include <vector>
#include <string>

using namespace std;

string s;
string c[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
string u[6] = { "Shi","Bai","Qian","Wan","Yi","Fu" };
vector <int> t;
vector <string> ans;

int main() {

	cin >> s;

	if (s == "0") { //特殊情况0
		cout << "ling" << endl;
		return 0;
	}

	bool isNeg = false;
	if (s[0] == '-') {
		isNeg = true;
		s = s.substr(1, s.size() - 1);
	}

	t.resize(s.size());
	int p = s.size() - 1;
	int len = 1;
	bool NotRead = true;//结尾的0不读
	bool ReadWan = false;
	while (p >= 0) {
		//每4位重置
		if (len % 4 == 1) {
			NotRead = true;
		}

		//第一个非零元素后面的0不读
		if (s[p] != '0') {
			NotRead = false;
			if (len < 5 && len < 9)
				ReadWan = true;
		}

		//不读的数位标记-1
		if (!NotRead)
			t[p] = (s[p] - '0');
		else
			t[p] = -1;

		len++; p--;
	}

	//去掉多余的0 例如 10080
	for (int i = s.size() - 1; i > 0; i--) {
		if (s[i] == '0' && s[i - 1] == '0') {
			t[i - 1] = -1;
		}
	}

	

	p = s.size() - 1;
	len = 1;
	while (p >= 0) {
		if (len == 5 && ReadWan)
			ans.push_back(u[3]);
		if (len == 9)
			ans.push_back(u[4]);

		int tag = len % 4;
		if (t[p] != -1) {
			if (t[p] != 0) {
				switch (tag) {
				case 2:ans.push_back(u[0]); break;
				case 3:ans.push_back(u[1]); break;
				case 0:ans.push_back(u[2]); break;
				default:
					break;
				}
			}
			ans.push_back(c[t[p]]);
		}
		p--; len++;
	}

	

	//补上负号
	if (isNeg) {
		ans.push_back(u[5]);
	}

	
	cout << ans[ans.size() - 1];
	for (int i = ans.size() - 2; i >= 0; i--) {
		cout << " " << ans[i];
	}

	return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值