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