7-23 币值转换

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式

输入在一行中给出一个不超过9位的非负整数。

输出格式

在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1

813227345

输出样例1

iYbQdBcScWhQdBeSf

输入样例2

6900

输出样例2

gQjB

分析与答案

虽然输出看上去有点令人绝望,但这个实际上是币值的大写转换问题,只是用字母表示数字和单位了。币值的大写转换除了枚举出零位出现的所有情况之外其实还可以用栈的方式,但是我不会(

先将9位数的数字(用长整型接收)拆分到一个9元素数组中,再分成 1 2345 6789三个部分来处理,其中第一位是亿位,2-5位是千万、百万、十万、万位,6-9是千、百、十、个位,可以发现2-5位与6-9位的区别仅仅在于处理完万位的部分要先输出一个"万"字,下面的程序就将这一部分拆分成了单独的函数。程序的注释中包含了2-5位/6-9位所有输出情况的枚举,以及需要输出零的情况。

#include <stdio.h>

long long int power_10(int i);
void print(int a,int b,int c,int d,char num[],char unit[]);
int main(){
    long long int input;
    scanf("%lld",&input);
    //拾、百、仟、万、亿
    char unit[5] = {'S','B','Q','W','Y'};
    //0-9
    char num[10] = {'a','b','c','d','e','f','g','h','i','j'};
    int divide[9];
    for(int i=0;i<9;i++){
        divide[i]=input / power_10(8-i);
        input -= divide[i]*power_10(8-i);
    }
    if(divide[0]){
        //亿处理
        printf("%c%c",num[divide[0]],unit[4]);
    }
    if(divide[1]||divide[2]||divide[3]||divide[4]){
        //千万、百万、十万、万处理
        print(divide[1],divide[2],divide[3],divide[4],num,unit);
        printf("%c",unit[3]);
    }
    else if(divide[0] && (divide[5]||divide[6]||divide[7]||divide[8])){
        //亿位非零,万位皆空,个、十、百、千至少有一个非零,先输出一个零
        printf("%c",num[0]);
    }
    if((divide[1]||divide[2]||divide[3]||divide[4]) && !divide[5])
        //万位至少一个非零,千位为零,先输出一个零
        printf("%c",num[0]);
    print(divide[5],divide[6],divide[7],divide[8],num,unit);
    return 0;
}
long long int power_10(int i){
    long long int res = 1;
    for(int j=0;j<i;j++)
        res *= 10;
    return res;
}
void print(int a,int b,int c,int d,char num[],char unit[]){
    if(a){
        //千位有数字
        printf("%c%c",num[a],unit[2]);//输出“a千”
        if(b == 0){
            if(c == 0){
                if(d != 0)
                    //千万位和万位有数字,a千零d
                    printf("%c%c",num[0],num[d]);
            else{
                //十位有数字
                if(d == 0)
                    //只有千、十位有数字,a千零c十
                    printf("%c%c%c",num[0],num[c],unit[0]);
                else
                    //千、十、个有数字,a千零c十d
                    printf("%c%c%c%c",num[0],num[c],unit[0],num[d]);
                }
            }
        }
        else{
            //百位有数字
            if(c == 0){
                //十位没有数字
                if(d == 0)
                    //只有千、百位有数字,a千b百
                    printf("%c%c",num[b],unit[1]);
                else
                    //千、百、个位有数字,a千b百零d万
                    printf("%c%c%c%c",num[b],unit[1],num[0],num[d]);
                }
            else{
                //十位有数字
                if(d== 0)
                    //千、百、十位有数字,a千b百c十
                    printf("%c%c%c%c",num[b],unit[1],num[c],unit[0]);
                else
                    //都有数字,a千b百c十d
                    printf("%c%c%c%c%c",num[b],unit[1],num[c],unit[0],num[d]);
                }
        }
    }
    else{
        //千位没有数字
        if(b==0){
            //百位没有数字
            if(c == 0)
                //十位没有数字,个位肯定有数字,d
                printf("%c",num[d]);
            else
                //c十d
                printf("%c%c%c",num[c],unit[0],num[d]);
        }
        else{
            if(c == 0){
                if(d==0)
                    //b百
                    printf("%c%c",num[b],unit[2]);
                else
                    //b百零d
                    printf("%c%c%c%c",num[b],unit[2],num[0],num[d]);
            }
            else{
                if(d==0)
                    //b百c十
                    printf("%c%c%c%c",num[b],unit[1],num[c],unit[0]);
                else
                    //b百c十d
                    printf("%c%c%c%c%c",num[b],unit[1],num[c],unit[0],num[d]);
            }
        }
    }
}

7-23 测试点