PTA--币值转换

学习目标:

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


下面展示–》 代码

#include<stdio.h>
#define MaxSize 50
char convert(char c);
int main() {
    //N代表输入的值,n代表N的临时值,m代表模除之后的余数,tag标记前一个处理的数是不是0(0:不是,1:是)
    int N, n, m = 0, j = 0, tag = 0;
    int money[MaxSize] = { 0 };
    //输入数字N
    scanf("%d", &N);
    //输入的数字为零的时候直接打印
    if (N == 0) {
        printf("a");
        return 0;
    }
    n = N;
    //将输入的所有数字都存储在数组中,包括0,且用10000和100000000来标识亿、万、千
    //以  102345000为例子,数组中存的{0,0,0,5,10000,4,3,2,0,100000000,1}
    while (n != 0) {
        m = n % 10;
        if (j == 4) {
            money[j++] = 10000;
        }
        if (j == 9) {
            money[j++] = 100000000;
        }
        money[j++] = m; 
        n = n / 10;
    }
    for (int s = j - 1; s >= 0; s--) {
        if (money[s] == 10000) {
            printf("W");
            //tag重新标识(100020 读作十万零二十,以万为单位的数‘0020’,’2‘前边的0是要读的)
            tag = 0;
        }
        else {
            if (money[s] == 100000000) {
                printf("Y");
                //tag重新标识(100020 读作十万零二十)
                tag = 0;
            }
            else {
                //如果连续存在多个0,则只输出一个,用tag区分(0:前一个元素非零,1:前一个元素是零)
                if (money[s] == 0 && tag == 0) {
                    int t = s;
                    int tag3 = 0;//截至10000或100000000前是否有非0数,如果有,则tag3 = 1
                    while (t >= 0 && money[t] != 10000 && money[t] != 100000000) {
                        if (money[t] != 0) {
                            tag3 = 1;
                            break;
                        }
                        t--;
                    }
                    //如果靠近10000或100000000前有连续的多个0,一个也不输出,反之,则输出。(Example:5200 结尾的两个零一个也不读)
                    if (tag3 != 0) {
                        printf("a");
                    }
                    tag = 1;
                }
                //元素不为零的时候
                if (money[s] != 0) {
                    //首先更改标记,表示当前位置非零,下一次进行判断的时候使用
                    tag = 0;
                    printf("%c", convert((char)money[s] + 48));
                    int l = s, k = 0;
                    //用于判断该位置是第几个(不超过四)
                    while (money[l] != 10000 && money[l] != 100000000 && l >= 0) {
                        l--;
                        k++;
                    }
                    switch (k) {
                    case 2: printf("S"); break;
                    case 3: printf("B"); break;
                    case 4: printf("Q"); break;
                    }
                }
            }
        }

    }
    return 0;
}
char convert(char a) {
    switch (a) {
    case '1': return 'b';
    case '2': return 'c';
    case '3': return 'd';
    case '4': return 'e';
    case '5': return 'f';
    case '6': return 'g';
    case '7': return 'h';
    case '8': return 'i';
    case '9': return 'j';
    }
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值