PTA基础题目集 7-23 币值转换 (20 分)(测试点有误)

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

输入格式:

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

输出格式:

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

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

做这道题的经历实在是太坎坷了……刚做的时候被这道题狠狠地卡住了一个半小时,写题解的时候发现有一个测试点有问题,原来写的代码有bug但却能通过测试,又被卡了半个小时。

开始的思路是用两个函数来计算数位和数字,然后输出,但是莫名其妙地在自己电脑上结果正确但是在PTA网站测试时结尾有0的情况下会在结尾多输出一个a。尝试了许久又拜托朋友在他们的电脑上尝试运行,最后放弃了,我觉得应该是编译器版本的问题。

之后搜了一下大家的代码,改用数组写。出现了版本1的代码,但是今天写题解的时候发现版本1的代码有一个很大的问题,如果输入的是一个五位以上的数,输出的结果固定会有一个W,如10000——bWW、100000000——bYW等,尽管如此PTA的编译器还是让我通过测试了。

于是就有了版本2,在版本1上稍作更改,输出W的情况多加了两个判断条件,这样就能顺利输出以上几种情况了,且同样能通过PTA测试。反馈给了陈越姥姥和PTA的反馈邮箱,不知道什么时候会更正。

代码如下:

版本1:(有bug!!!,但能通过测试,正确版本请直接看版本2)

#include <stdio.h>
#include <string.h>
int main()
{
	int i,n;
	char a[10];
	scanf("%s",&a);
	char b[9]={'\n','S','B','Q','W','S','B','Q','Y'};
    if(a[0]=='0')
    {
        printf("a\n"); return 0;
    }
    n=strlen(a);//注意使用此函数要添加头文件string.h
    for(i=0;i<n;i++)
    {
        if(a[i]=='0')
        {
            if(i==n-4)//从这里就有bug了,无脑在数位大于千的时候输出W,会导致输出W重复等问题
            {
                printf("W");
            }
            if(i<n-1&&a[i+1]=='0'||i==n-1)
            {
                continue;
            }
            else
            {
                printf("a");
            }
        }
        else
        {
            printf("%c%c",a[i]+'a'-'0',b[n-i-1]);
        }
	}
	return 0;
}

版本2:挑了几个数试了试感觉应该是没问题了,大家试下,如果有问题请联系我。

#include <stdio.h>
#include <string.h>
int main()
{
	int i,n;
	char a[10];
	scanf("%s",&a);
	char b[9]={'\n','S','B','Q','W','S','B','Q','Y'};
    if(a[0]=='0')
    {
        printf("a\n"); return 0;
    }
    n=strlen(a);//注意使用此函数要添加头文件string.h
    for(i=0;i<n;i++)
    {
        if(a[i]=='0')
        {
            if(i==n-5)//判断是否需要在有0的情况下输出W,大于5位则进一步判断
            {
                if(n==9)
                {
                    if(a[1]!='0'||a[2]!='0'||a[3]!='0'||a[4]!='0')
                    //9位数时判断千万、百万、十万、万上是否有非零字符,有则输出W,否则不输出
                    {
                        printf("W");
                    }
                }
                else if(n<9)//小于九位数首位必定非零,无需判断,直接输出
                    printf("W");
            }
            if(i<n-1&&a[i+1]=='0'||i==n-1)//判断最后一位是否需要输出a
            {
                continue;
            }
            else
            {
                printf("a");
            }
        }
        else
        {
            printf("%c%c",a[i]+'a'-'0',b[n-i-1]);//利用ASCII码进行数字的输出,随后输出数位
        }
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值