题目:
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样式1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样式2:
gQjB
解题思路:
个人认为问题在于零的处理,即单个出现零、连续出现零、该零位之后全是零及该零位之后不全是零情况下如何打印单位“零”的问题。
输入:
将输入的N每位加上97存储到数值num[]中(对应a-j字母的ascII编码),一个char数组m[]存储每位对应题目要求的“个、十、百、千、万、...”;
输出逻辑:
1)由高到低输出每一位,非0位输出该位对应字符,然后再输出对应单位;
2)对于0位,预先设置两个变量flag1(零打印标志位,某次打印了零,即置1)、flag2(低位全零标志位,某位后不全是0,即置0),每次遇到0,判断如果是条件1:第一次遇到0(即上一次打印非零的前提下)且条件2:该0位的低位不全是0则打印一次零,当连续遇到0时不满足第一个条件,当某位后全是0时(例如:23000)不满足第二个条件都不会(多次)打印零;
特殊情况:
输入的N=0,直接打印零,否则进入输出逻辑中;
当N>万时必定打印“W”。
代码:
#include<stdio.h>
void main()
{
int N,n;
int i,p;
int flag1 = 0; //零打印标志位,初始为0表示没打印过“零”;遇到“0”,若flag=0,则打印并将flag置1,连续遇到“0”时则不打印;
int flag2 = 1; //低位全零标志位,初始为1表示小于某位的值全是零,若比某位小出现了非零则置0,如:10000,1后面全是0则flag2=1,再如10002,1之后出现了2则flag2=0;
scanf("%d",&N);
n = N;
int num[9]; //数组里面存储小写英文字母对应的值,如0对应a,a对应97;
char m[9] = {'\n','S','B','Q','W','S','B','Q','Y'};
for(i = 0;i<9;i++)
{
num[i] = n%10+97;
n = n/10;
}
//让数组指针i停在最高位:
i = 8;
while(num[i] == 97 && i>0)
{
i--;
}
//输出逻辑如下:
if(N != 0) {
while(i>=0)
{
if(num[i] != 97){
flag1 = 0;
printf("%c%c",num[i],m[i]);
}else{
flag2 = 1; //每次遇到0都先将flag2置1,即先假定该0位后面全是0;
//判断全零标志flag2的值(初始为1,即表示某位后面全是0);
p = i-1;
while(p>=0){
if(num[p] != 97){
flag2 = 0;
}
p--;
}
if(i == 4){ //若N值高于万,则万位W无论如何都要打印;
printf("%c",m[i]);
}
if(flag1 == 0 && flag2 != 1){ //如果第一次出现0且该0位之后还有不为0的位,则打印零;
printf("%c",num[i]);
}
flag1 = 1;
}
i--;
}
}else{
printf("a");
}
}
测试点截图:
表述不恰逻辑结合代码理解;
如果还有错误望指出blablabla...