【PTA基础编程题目集(C语言)】7-23 币值转换

该文章描述了一个编程问题,要求将不超过9位的整数人民币值转换为大写中文格式,使用小写字母代表数字,并处理零的特殊打印规则。解题思路涉及零的处理逻辑,包括首次出现零和全零情况,以及代码实现中的标志位和循环遍历方法。
摘要由CSDN通过智能技术生成

题目:

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

输入格式:

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

输出格式:

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

输入样式1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样式2:

gQjB


解题思路:

个人认为问题在于零的处理,即单个出现零、连续出现零、该零位之后全是零及该零位之后不全是零情况下如何打印单位“零”的问题。

输入:

将输入的N每位加上97存储到数值num[]中(对应a-j字母的ascII编码),一个char数组m[]存储每位对应题目要求的“个、十、百、千、万、...”;

输出逻辑:

1)由高到低输出每一位,非0位输出该位对应字符,然后再输出对应单位;

2)对于0位,预先设置两个变量flag1(零打印标志位,某次打印了零,即置1)、flag2(低位全零标志位,某位后不全是0,即置0),每次遇到0,判断如果是条件1:第一次遇到0(即上一次打印非零的前提下)条件2:该0位的低位不全是0则打印一次零,当连续遇到0时不满足第一个条件,当某位后全是0时(例如:23000)不满足第二个条件都不会(多次)打印零;

特殊情况:

  1. 输入的N=0,直接打印零,否则进入输出逻辑中;

  1. 当N>万时必定打印“W”。


代码:

#include<stdio.h>
void main()
{
    int N,n;
    int i,p;
    int flag1 = 0;        //零打印标志位,初始为0表示没打印过“零”;遇到“0”,若flag=0,则打印并将flag置1,连续遇到“0”时则不打印; 
    int flag2 = 1;        //低位全零标志位,初始为1表示小于某位的值全是零,若比某位小出现了非零则置0,如:10000,1后面全是0则flag2=1,再如10002,1之后出现了2则flag2=0; 
    scanf("%d",&N);
    n = N;
    int num[9];    //数组里面存储小写英文字母对应的值,如0对应a,a对应97; 
    char m[9] = {'\n','S','B','Q','W','S','B','Q','Y'};
    
    for(i = 0;i<9;i++)
    {
        num[i] = n%10+97;
        n = n/10;
    }
    
    //让数组指针i停在最高位:
    i = 8;        
    while(num[i] == 97 && i>0)
    {
        i--;
    } 
    
    //输出逻辑如下: 
    if(N != 0) {
        while(i>=0)
    {
        if(num[i] != 97){
            flag1 = 0;     
            printf("%c%c",num[i],m[i]);
        }else{
            flag2 = 1;        //每次遇到0都先将flag2置1,即先假定该0位后面全是0; 
            
            //判断全零标志flag2的值(初始为1,即表示某位后面全是0);
            p = i-1;
            while(p>=0){
                if(num[p] != 97){
                    flag2 = 0;
                }
                p--;
            }
            
            if(i == 4){        //若N值高于万,则万位W无论如何都要打印; 
                printf("%c",m[i]);
            }
            
            if(flag1 == 0 && flag2 != 1){    //如果第一次出现0且该0位之后还有不为0的位,则打印零; 
                printf("%c",num[i]);
            }
            flag1 = 1;    
        }
        i--;
    }
    }else{
        printf("a");
    }
}

测试点截图:


表述不恰逻辑结合代码理解;

如果还有错误望指出blablabla...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值