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

题目:

输入一个整数(位数不超过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...

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PTA_基础编程答案_整章 包括但不限于如下 7-1 厘米换算英尺英寸 15 27785 103313 0.27 7-2 然后是几点 15 20063 78572 0.26 7-3 逆序的三位数 10 24732 62644 0.39 7-4 BCD解密 10 14066 23357 0.60 7-5 表格输出 5 15169 36439 0.42 7-6 混合类型数据格式化输入 5 15719 36076 0.44 7-7 12-24小时制 15 14687 51855 0.28 7-8 超速判断 10 15328 39238 0.39 7-9 用天平找小球 10 15145 33252 0.46 7-10 计算工资 15 14241 35238 0.40 7-11 分段计算居民水费 10 12907 35261 0.37 7-12 两个数的简单计算器 10 12912 33359 0.39 7-13 日K蜡烛图 15 9280 34024 0.27 7-14 求整数段和 15 11461 55664 0.21 7-15 计算圆周率 15 9826 33135 0.30 7-16 求符合给定条件的整数集 15 8986 21898 0.41 7-17 爬动的蠕虫 15 9739 24881 0.39 7-18 二分法求多项式单根 20 7282 31752 0.23 7-19 支票面额 15 7375 21837 0.34 7-20 打印九九口诀表 15 10325 35138 0.29 7-21 求特殊方程的正整数解 15 7799 22600 0.35 7-22 龟兔赛跑 20 7446 29142 0.26 7-23 币值转换 20 4333 18467 0.23 7-24 约分最简分式 15 6728 15335 0.44 7-25 念数字 15 6724 20180 0.33 7-26 单词长度 15 5648 37409 0.15 7-27 冒泡法排序 20 7255 24045 0.30 7-28 猴子选大王 20 6144 13327 0.46 7-29 删除字符串中的子串 20 4798 15074 0.32 7-30 字符串的冒泡排序 20 4752 14741 0.32 7-31 字符串循环左移 20 4527 13605 0.33 7-32 说反话-加强版 20 4030 25470 0.16 7-33 有理数加法 15 4476 10862 0.41 7-34 通讯录的录入与显示 10 4323 19524 0.22 7-35 有理数均值 20 3281 17202 0.19 7-36 复数四则运算 15 2530 10103 0.25 7-37 整数分解为若干项之和 20 2437 4673 0.52 7-38 数列求和-加强版 20 4692 35190 0.13 当前显示1 - 38项,共38项

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值