#include <iostream>
using namespace std;
#include <string>
#include <list>
string n2c(int num) {
string res;
switch (num) {
case 0:
res = "零";
break;
case 1:
res = "壹";
break;
case 2:
res = "贰";
break;
case 3:
res = "叁";
break;
case 4:
res = "肆";
break;
case 5:
res = "伍";
break;
case 6:
res = "陆";
break;
case 7:
res = "柒";
break;
case 8:
res = "捌";
break;
case 9:
res = "玖";
break;
}
return res;
}
string cnt2w(int cnt) {
string res;
switch (cnt) {
case 1:
res = "拾";
break;
case 2:
res = "佰";
break;
case 3:
res = "仟";
break;
case 4:
res = "万";
break;
case 5:
res = "拾";
break;
case 6:
res = "佰";
break;
case 7:
res = "仟";
break;
case 8:
res = "亿";
break;
}
return res;
}
int main() {
string num, li;
getline(cin, num, '.');
getline(cin, li);
list<string> out;
if (li == "00") {
out.push_front("整");
} else {
int a = li[1] - '0';
int b = li[0] - '0';
if (a != 0) {
out.push_front("分");
out.push_front(n2c(a));
}
if (b != 0) {
out.push_front("角");
out.push_front(n2c(b));
}
}
if (num != "0") {
out.push_front("元");
bool flag = false;
if (num[num.size() - 1] != '0') {
int t = num[num.size() - 1] - '0';
out.push_front(n2c(t));
flag = true;
}
int cnt = 1;
for (int i = num.size() - 2; i >= 0; i--) {
if (cnt == 4) {
out.push_front(cnt2w(cnt));
flag = false;
}
if (num[i] == '0') {
if (cnt <= 6 && flag) {
out.push_front("零");
flag = false;
}
} else {
flag = true;
int t = num[i] - '0';
if (cnt != 4) {
out.push_front(cnt2w(cnt));
}
if (!(out.front() == "拾" && t == 1)) {
out.push_front(n2c(t));
}
}
cnt++;
}
}
cout << "人民币";
for (auto s : out) {
cout << s;
}
}
设了一个计数器算位数,在符合位数的0开头加0,若达到“万”级别则打印万
要注意0.12这样的状态,不一定有“元”
用例是double,最多到亿,所以亿不需要固定打印
感觉这个方法还是很笨,如果要优化的话,应该是4位为一个单位,里面循环十百千,外面是万 亿 兆

京公网安备 11010502036488号