币值转换
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
上面是测试点,思路:
1.用字符数组接收数据
2.设置两个字符数组,一个存a~j,一个存单位
3.再将数组逆置(因为我后面准备用atoi函数将字符串转成整型,而我们要从高位开始输出)(这地方可以不转整型用字符数组做,我懒得改了),转成整型
补:如果末尾全是0逆置后转换整型后0就会都消失
4.写一个计算整数位数的函数
5.这题主要在于0和W的处理
1.0的处理:末尾全是0时,整数的位数和一开始字符数组的有效长度是不同的(这个是最重要的,因为后面的处理都根据这个),这个循环次数是整数的位数,所以去掉那些0后循环次数也是对 的(这里不理解的话,可以自己动手算一下循环次数,也就是这里把前面不为0的部分全部按题目输出了);
中间0的处理:假设当前数为0且后面一个也为0则不输出
2.W的处理:看代码注释吧
#include <stdio.h> #include <stdlib.h> #include <string.h> int count(int n){ int count=0; while(n){ n/=10; count++; } return count; } int main(){ char b[10],c[10]; int i,n; char a[11],d[7]={'0','S','B','Q','W','Y'}; for(i=0;i<=9;i++) a[i]='a'+i;//a~j存到数组a中 gets(b); char *p=b+strlen(b)-1,*q=c; while(*p){ *q=*p; q++; p--; }//数组逆置 *q=0; n=atoi(c);//字符转整型的函数 int t=n;for(i=1;i<=count(n);i++){ if(!(t%10==0&&t/10%10==0))//处理中间0 printf("%c",a[t%10]); if(strlen(b)==9&&i==1) printf("Y"); if(t%10&&(strlen(b)-i)%4<=4&&(strlen(b)-i)%4!=0)//若数字为0时则后面不跟单位,当处理第四位数字时要输出W单独处理 printf("%c",d[(strlen(b)-i)%4]); if(strlen(b)-i==4)//W的单独处理 printf("W"); t/=10; } if(strlen(b)-count(n)>1&&strlen(b)>4)//处理末尾全是0且总位数超过4的情况下W printf("W"); if(n==0)//这是第四个测试点,我这个卡了半年 printf("a"); }