7-83 币值转换
分数 20
全屏浏览题目
切换布局
作者 陈建海
单位 浙江大学
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
#include <stdio.h>
#include <string.h>
int main(){
int n;//输入的数
int num[9];//存放输入的数,从个位开始存
char s[20];//最后输出的字符串,长度随便给的,超过2*9+1就行。
scanf("%d",&n);
int flagw=n/10000%10000;//判断1qw到w之间是否大于0,大于一定输出位符号W
//把输入的数拆分放入num[9],index最后为该数的位数
int index=0;
do{
num[index++]=n%10;
n/=10;
}while(n);
//去除末尾0;
int index0=0;
if(index==1&&num[0]==0){//只有一位数并且末尾是0,就不去除
printf("a");
return 0;
}
for(int i=0;i<index;i++){
if(num[i]==0){
index0++;
}else{
break;
}
}
//中间的零,多个零变一个,一个保留。//把要去除的0变-1,后续遍历到-1不做处理,即不输出单位不输出零。
int flag=0;//多个零标记
for(int i=index0;i<index;i++){//从个位开始遍历,越过末尾0的个数
if(flag==0&&num[i]==0){//这是遍历到中间的第一个0,要输出。
flag=1;
}else if(flag==1&&num[i]==0){
num[i]=-1;
}else if(flag==1&&num[i]!=0){
flag=0;
}
}
// //打印num[],调试
// for(int i=0;i<index;i++){
// printf("%d ",num[i]);
// }
// printf("\n");
//把num[9]抓换到字符串s[20]
char c;//记录单位
int j=0;
for(int i=index-1;i>=0+index0;i--){//字符串第一位放最高位,所有num[9]逆序遍历
if(i==4&&num[i]==-1&&flagw){//flagw为1,则一定在遍历到i==4(w位)时,输出'W'(即放入字符串中s[20]);
s[j]='W';
j++;
}
if(num[i]!=-1){
s[j]=num[i]+97;
j++;
if(num[i]!=0){//0不需要输出单位,所以判断num[i]!=0时输出单位
switch(i){
case 0:c='\0';break;//个位就不输出单位 ,并且是最后一个,直接给字符串结束符号‘\0’;
case 5:
case 1: c='S';break;
case 6:
case 2: c='B';break;
case 7:
case 3: c='Q';break;
case 4: c='W';break;
case 8: c='Y';break;
}
s[j]=c;
j++;
}
}
}
if(flagw&&index0>4){//当末尾0超过w时,w位不会走上面for循环,因为i>=0+index0,但是flagw为1,任然要输出'W';
s[j]='W';
j++;
}
s[j]='\0';//最后还得给个结束符,应对个位为0的情况。因为个位为0,上面for不会遍历末尾0,导致没结束‘\0’.这里给上。
// int len=strlen(s);
// printf("%d",len);
printf("%s",s);//输出最终结果。
return 0;
}