给一个数字要用中文读出。
主要还是单位的判定和零的读法。
例如:
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;
}