题解 | #人民币转换#
人民币转换
http://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b
看了所有人的代码都有问题,可用以下两个用例验证:
1.输入:5000100010.0 正确输出:人民币伍拾亿零拾万零拾元整
2.输入:100001000 正确输出:人民币壹亿零壹仟元整
万亿元以下的代码如下:
核心思路: 分成三段seg打印:某亿、某万、某元。
此外,段间有相互关系,如亿位有,万位无,就不能打印“万”字了。
介于题目要求,但凡碰到十位都应写拾而不是一拾,所以严格说1010应读成壹仟零壹拾元整,而不是壹仟零拾元整;
元也应写为圆,所以并不是最规范的解决方案。
相比其他代码有bug,本代码已经相对自恰了。
#include<stdio.h>
#include<stdbool.h>
char num[10][5] = { "零","壹","贰","叁","肆","伍","陆","柒","捌","玖" };
char unit[5][5] = { "","","拾","佰","仟" };
void prione(int* str, int* end) {//打印如“伍拾”、“贰佰”
if (*str != 0) {
if (*str != 1 || *str == 1 && str - end != 2)
printf("%s%s", num[*str], unit[str - end]);
else
printf("拾");
str--;
}
}
void prizero(int* beg, int* end) {//零的打印
bool flag = true;//后面全是零吗?
int i = 0;
while (beg - i != end) {
if (*(beg - i) != 0)flag = false;
i++;
}
if (flag == false)
printf("零");
while (*beg == 0 && beg != end)beg--;
}
void priseg(int* beg, int* end) {//end是最后一个待打印字符后一位,不能打印全零,也不能打印前面的零
while (beg != end)
if (*beg) {//非零,打完跳下一个
prione(beg, end);
beg--;
}
else {//打零,打完一直跳到非零或者end
prizero(beg, end);
while (*beg == 0 && beg != end)beg--;
}
}
bool print(int* arr) {//打印整数部分,若为零返回false
int* yi = NULL, * wan = NULL, * yuan = NULL;
for (int i = 1; i <= 12; i++)
if (arr[i] != 0) {
if (i <= 4)yuan = arr + i;
else if (i <= 8)wan = arr + i;
else yi = arr + i;
}
if (yi) {
priseg(yi, arr + 8);
printf("亿");
}
if (wan) {
if (wan != arr + 8 && yi)printf("零");//过亿,且千万位没数,且万位又不空,打零
priseg(wan, arr + 4);
printf("万");
}
if (yuan) {
if (yuan == arr + 4 && wan == NULL && yi)printf("零");//一亿零伍仟的情况
if (yuan != arr + 4 && (wan || yi))printf("零");//某亿某万零伍佰,某万零伍佰
priseg(yuan, arr);
}
if (yi || wan || yuan) {
printf("元");
return true;
}
else
return false;
}
bool prifra(int* arr) {//arr[0]存角,arr[1]存分,返回是否有分数
if (arr[0] == 0 && arr[1] == 0)return false;
if (arr[0])printf("%s角", num[arr[0]]);
if (arr[1])printf("%s分", num[arr[1]]);
return true;
}
int main() {
char buf[30];
while (fgets(buf, 30, stdin)) {
int arri[13] = { 0 };
int arrf[2] = { 0 };
int i = 0;
while (buf[i] != '.' && buf[i] != '\n')i++;
for (int j = i - 1; j >= 0; j--)arri[i - j] = buf[j] - '0';
if (buf[i] == '.')
for (int j = i + 1; buf[j] != '\n'; j++)
arrf[j - i - 1] = buf[j] - '0';
printf("人民币");
bool in=print(arri);
bool f=prifra(arrf);
if (in == false && f == false)
printf("零元整");
else if(in && !f)
printf("整");
printf("\n");
}
}