题目
把一串数字,用中文拼音输出
代码及思路
- 题目中说明了数字长度不超过九位数,所以可以很简单的划分长度,前五位和后四位
- 可以发现,除了前五位和后四位之间的过渡有个“Wan”和如果有第九位就会有个“Yi”以外,他们在十百千上的输出逻辑是相通的
- 建立两个二维字符类型的数组,直接存储好每个数字后面所需要输出的单位
- 比如123456789,它们分别就是亿千百十万千百十,这样的话用单位数组对应的下标来分别记录他们的单位
- 然后就到了输出部分,可以看到题目中给的一个Sample为100800,可以发现,如果一个数字后面都是0,则输出完本身的数字和单位后就停止,然后根据是否在“万”以前和“万”以后来决定循环的进行是终止还是直接跳到千位,所以需要在循环的过程中建立一个flagwan来记录当前的位数是否是在“万”之前还是之后。
- 如果一个数字本身是0,则只输出0不输出单位
- 剩下的问题就是coding的边界问题了,比如为0的时候下一步跳到哪里,主要是对于i的位置的判断,还有因为分成两段,所以判0的长度的下标也需要根据当前的位置动态变化,这个题好像最难的地方就是边界问题和跳转问题
#include<cstdio>
#include<string>
#include<iostream>
#include<math.h>
using namespace std;
char num[10][5] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
char dim[5][5] = { "Yi","Qian", "Bai", "Shi", "Wan" };
int main() {
string str;
cin >> str;
int flag[9];
int flagwan = true;
if (str[0] == '-') {
str.erase(str.begin());
printf("Fu ");
}
int lenth = str.length();
int j = 3;
for (int i = lenth - 2; i >= 0; i--) {
flag[i] = j;
j--;
if (j == 0 && flagwan) {
j = 3;
i--;
flag[i] = 4;
flagwan = false;
}
else if (j == 0 && !flagwan) {
j = 3;
i--;
flag[i] = 0;
flagwan = false;
}
}
if (lenth >= 5) flagwan = true;
else flagwan = false;
int poszero;
for (int i = 0; i < lenth; i++) {
if (i <= lenth - 5) poszero = lenth - 5;
else poszero = lenth - 1;
bool flagzero = true;
int tempi = i + 1;
int index = str[i] - '0';
if (flagwan) { // 在万之前的
while (tempi <= poszero) {
if (str[tempi] != '0') {
flagzero = false;
break;
}
tempi++;
}
if (!flagzero) { //后面不全为0
if (index == 0) { printf("%s", num[0]); }
else {
printf("%s %s", num[index], dim[flag[i]]);
}
}
else if (flagwan && lenth - i - 1 == 4) {
printf("%s Wan", num[index]);
flagwan = false;
}
else if (flagzero) { //后面全是0
printf("%s %s Wan", num[index], dim[flag[i]]);
flagwan = false;
i = lenth - 5;
}
printf(" ");
}
else { //在万之后的
while (tempi <= poszero) {
if (str[tempi] != '0') {
flagzero = false;
break;
}
tempi++;
}
if (!flagzero) { //后面不全为0
if (index == 0) { printf("%s", num[0]); }
else {
printf("%s %s", num[index], dim[flag[i]]);
}
}
else if (i == lenth - 1) {
printf("%s", num[index]);
break;
}
else if (flagzero) { //后面全是0
printf("%s %s", num[index], dim[flag[i]]);
break;
}
if (i != lenth - 1) printf(" ");
}
}
}