看了所有人的代码都有问题,可用以下两个用例验证:

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");
    }
}