题目内容:
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
题目注意点:
这里题目说了“零”的用法必须符合中文习惯,那么了解大写金额的标准写法就很有必要了(其实这道题就是完全模拟人民币大写金额表示方法的算法来写代码)。其次,题目中末尾结尾已经带了“元”字了,所以我们最后不需要再输出代表个位上“元”这个字符。来说说大写金额要注意的点:
(一)除了“零”之外的其他数字,在后面是需要跟数位的,比方说6904元的大写金额是“陆仟玖佰零肆”元,这里只有零后面没有跟位数;
(二)在个位至千位、万位至千万位这两个区间中,连续的“零”(但非末尾连续)只需表示一次。比如1008元大写为“壹仟零捌”元,20080097元大写为“贰仟零捌万零玖拾柒”元,均只对应了一个“零”字;
(三)在个位至千位、万位至千万位这两个区间中,若从个位/万位往更高位看,连续的“零”不需要表示。如2000元大写为“贰仟”元,61304500元大写为“陆仟壹佰叁拾万肆仟伍佰”元;
(四)若万位至千万位区间上的数字至少有一个不为“零”,则万位需要表示,若万位至千万位区间上的数字均为“零”,则万位无需表示。如100000340元大写为“壹亿零叁佰肆拾”元,87002509元大写为“捌仟柒佰万贰仟伍佰零玖”元。
答题代码:
#include <stdio.h>
#include <string.h>
int main(){
char money[10];
char MONEY[18];
int endofzero=0; //表示输入数值的末尾共连续有多少个0
int midofzero=0; //表示从万位起向更高位共连续有多少个0
int add=0; //需要输出位数字符之前,让add++
int num=-1; //需要输出数字字符之前,让num++
int theleftzero=0; //用于判定需要输出的这个0数字的上一位是否也是0,如果也是0也无需重复输出
scanf("%9s",money);
int len;
int i;
len=strlen(money); //len表示输入字符的长度
for (i = 0; i < len; ++i){ //本循环将money[]数组的数字0-9转化为对应a-j的字符
money[i]+=('a'-'0');
}
for (i = len-1; i >=0; i--){ //从输入数值的个位依次向最高位检查,记录连续有多少个0
if (money[i]=='a'){
endofzero++;
}else{
break;
}
}
if (len>5){ //len>5这表明输入的数值至少达到十万位
for (i = len-5; i >= 0; i--){ //从万位起向最高位检查,记录连续有多少个0
if (money[i]=='a'){
midofzero++;
}else{
break;
}
}
}
if (len>=5){ //输入数字达到万位数时进入判定
for (i = 0; i < len-4-midofzero; ++i){ //从最高位数字开始遍历至万位前最后的非0数字对应的位数
if (money[i]!='a'){
num++;
MONEY[num+add]=money[i];
theleftzero=0; //当输出一个非0的数字时,将theleftzero赋值为0
switch(len-i){
case 9:add++;MONEY[num+add]='Y';break;
case 8:add++;MONEY[num+add]='Q';break;
case 7:add++;MONEY[num+add]='B';break;
case 6:add++;MONEY[num+add]='S';break;
default:break;
}
}else if(money[i] =='a'&&theleftzero==0){
num++;
MONEY[num+add]=money[i];
theleftzero=1; //当输出一个数字0时,将theleftzero赋值为1
}
}
if(midofzero<4){ //若midofzero>=4(万至千万位全是0),则无需输出'W'
add++;
MONEY[num+add]='W';
}
theleftzero=0;
if (endofzero<4){ //仅当endofzero<4,个位至千位上才至少存在非0的数字
for (i = len-4; i < len-endofzero; ++i){ //从千位开始遍历至各位前最后一个非0数字对应的位数
if (money[i]!='a'){
num++;
MONEY[num+add]=money[i];
theleftzero=0; //当输出一个非0的数字时,将theleftzero赋值为0
switch(len-i){
case 4:add++;MONEY[num+add]='Q';break;
case 3:add++;MONEY[num+add]='B';break;
case 2:add++;MONEY[num+add]='S';break;
default:break;
}
}else if(money[i] =='a'&&theleftzero==0){
num++;
MONEY[num+add]=money[i];
theleftzero=1; //当输出一个数字0时,将theleftzero赋值为1
}
}
}
}else{
if(len==1&&endofzero==1){ //用于处理仅输入数字0的特殊情况
num++;
MONEY[0]=money[0];
}else{
for (i = 0; i < len-endofzero; ++i){ //从最高位数字开始遍历至个位前最后的非0数字对应的位数
if (money[i]!='a'){
num++;
MONEY[num+add]=money[i];
theleftzero=0; //当输出一个非0的数字时,将theleftzero赋值为0
switch(len-i){
case 4:add++;MONEY[num+add]='Q';break;
case 3:add++;MONEY[num+add]='B';break;
case 2:add++;MONEY[num+add]='S';break;
default:break;
}
}else if(money[i] =='a'&&theleftzero==0){
num++;
MONEY[num+add]=money[i];
theleftzero=1; //当输出一个数字0时,将theleftzero赋值为1
}
}
}
}
MONEY[num+add+1]='\0';
printf("%s\n",MONEY);
return 0;
}