C语言—程序设计入门—PTA练习题 7-083币值转换

题目内容:

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

输入格式:

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

输出格式:

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

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

题目注意点:

这里题目说了“零”的用法必须符合中文习惯,那么了解大写金额的标准写法就很有必要了(其实这道题就是完全模拟人民币大写金额表示方法的算法来写代码)。其次,题目中末尾结尾已经带了“元”字了,所以我们最后不需要再输出代表个位上“元”这个字符。来说说大写金额要注意的点:

(一)除了“零”之外的其他数字,在后面是需要跟数位的,比方说6904元的大写金额是“陆仟玖佰零肆”元,这里只有零后面没有跟位数;

(二)在个位至千位、万位至千万位这两个区间中,连续的“零”(但非末尾连续)只需表示一次。比如1008元大写为“壹仟零捌”元,20080097元大写为“贰仟零捌万零玖拾柒”元,均只对应了一个“零”字;

(三)在个位至千位、万位至千万位这两个区间中,若从个位/万位往更高位看,连续的“零”不需要表示。如2000元大写为“贰仟”元,61304500元大写为“陆仟壹佰叁拾万肆仟伍佰”元;

(四)若万位至千万位区间上的数字至少有一个不为“零”,则万位需要表示,若万位至千万位区间上的数字均为“零”,则万位无需表示。如100000340元大写为“壹亿零叁佰肆拾”元,87002509元大写为“捌仟柒佰万贰仟伍佰零玖”元。

答题代码:

#include <stdio.h>
#include <string.h>

int main(){
    char money[10];
    char MONEY[18];
    int endofzero=0; //表示输入数值的末尾共连续有多少个0
    int midofzero=0; //表示从万位起向更高位共连续有多少个0
    int add=0; //需要输出位数字符之前,让add++
    int num=-1; //需要输出数字字符之前,让num++
    int theleftzero=0; //用于判定需要输出的这个0数字的上一位是否也是0,如果也是0也无需重复输出
    scanf("%9s",money);
    int len;
    int i;
    len=strlen(money); //len表示输入字符的长度
    for (i = 0; i < len; ++i){ //本循环将money[]数组的数字0-9转化为对应a-j的字符
        money[i]+=('a'-'0');
    } 
    for (i = len-1; i >=0; i--){ //从输入数值的个位依次向最高位检查,记录连续有多少个0
        if (money[i]=='a'){
            endofzero++;
        }else{
            break;
        }
    }
    if (len>5){ //len>5这表明输入的数值至少达到十万位
        for (i = len-5; i >= 0; i--){ //从万位起向最高位检查,记录连续有多少个0
            if (money[i]=='a'){    
                midofzero++;
            }else{
                break;
            }
        }
    }
    if (len>=5){ //输入数字达到万位数时进入判定
        for (i = 0; i < len-4-midofzero; ++i){ //从最高位数字开始遍历至万位前最后的非0数字对应的位数
            if (money[i]!='a'){
                num++;
                MONEY[num+add]=money[i];
                theleftzero=0; //当输出一个非0的数字时,将theleftzero赋值为0
                switch(len-i){
                case 9:add++;MONEY[num+add]='Y';break;
                case 8:add++;MONEY[num+add]='Q';break;
                case 7:add++;MONEY[num+add]='B';break;
                case 6:add++;MONEY[num+add]='S';break;
                default:break;
                }
            }else if(money[i] =='a'&&theleftzero==0){
                num++;
                MONEY[num+add]=money[i];
                theleftzero=1; //当输出一个数字0时,将theleftzero赋值为1
            }
        }
        if(midofzero<4){ //若midofzero>=4(万至千万位全是0),则无需输出'W'
            add++;
            MONEY[num+add]='W';
        }
        theleftzero=0;
        if (endofzero<4){ //仅当endofzero<4,个位至千位上才至少存在非0的数字
            for (i = len-4; i < len-endofzero; ++i){ //从千位开始遍历至各位前最后一个非0数字对应的位数
                if (money[i]!='a'){
                    num++;
                    MONEY[num+add]=money[i];
                    theleftzero=0; //当输出一个非0的数字时,将theleftzero赋值为0
                    switch(len-i){
                    case 4:add++;MONEY[num+add]='Q';break;
                    case 3:add++;MONEY[num+add]='B';break;
                    case 2:add++;MONEY[num+add]='S';break;
                    default:break;
                    }
                }else if(money[i] =='a'&&theleftzero==0){
                    num++;
                    MONEY[num+add]=money[i];
                    theleftzero=1; //当输出一个数字0时,将theleftzero赋值为1
                }
            }
        }
    }else{
        if(len==1&&endofzero==1){ //用于处理仅输入数字0的特殊情况
            num++;
            MONEY[0]=money[0];
        }else{
            for (i = 0; i < len-endofzero; ++i){ //从最高位数字开始遍历至个位前最后的非0数字对应的位数
                if (money[i]!='a'){
                    num++;
                    MONEY[num+add]=money[i];
                    theleftzero=0; //当输出一个非0的数字时,将theleftzero赋值为0
                    switch(len-i){
                    case 4:add++;MONEY[num+add]='Q';break;
                    case 3:add++;MONEY[num+add]='B';break;
                    case 2:add++;MONEY[num+add]='S';break;
                    default:break;
                    }
                }else if(money[i] =='a'&&theleftzero==0){
                    num++;
                    MONEY[num+add]=money[i];
                    theleftzero=1; //当输出一个数字0时,将theleftzero赋值为1
                }
            }
        }
    }
    MONEY[num+add+1]='\0';
    printf("%s\n",MONEY);  
    return 0;
}

 

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值