输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB
整体思想:
将整数拆分成单个数字,同时转换成字母存入字符数组中,同时将计数单位存入字符数组,
最后倒序打印。
1.先定义需要的变量;
char ch_digit[11] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
char ch_unit1[4] = { 'S','B','Q' };
char ch_unit2[3] = { 'W','Y' };
//需要将万位和亿位拎出来,因为他俩比较特别,最多只需要打印一次。
char ch_ljl[100];//存储字母。
int i, j = 0;
int stu = 0, we = 0;
//j:总位数;stu:计数单位位数;we:数字位数。
//分成3类方便存入ch_ljl数组。
2.存入;
while (n) {
i = n % 10;
ch_ljl[j] = ch_digit[i];
n /= 10;
if (n == 0) {
break;
}//当n等于零时,已经无需打印位数。
j++;
we++;
//每存入一个数字,总位数+1,数字+1.
if (we < 4 || (we > 4 && we < 8) || we>8) {
ch_ljl[j] = ch_unit1[stu];
stu++;
j++;
}
else if (we == 4) {
ch_ljl[j] = ch_unit2[0];
stu = 0; //万位之后从十为开始重新开始。
j++;
}
else if (we == 8) {
ch_ljl[j] = ch_unit2[1];
stu = 0;
j++;
}
}
到这里还算顺利,后面才是真正麻烦的,主要有两个问题:
(1).中间零的处理;
(2).末尾零的处理;
其中,中间零还需要考虑当万位上是零的时候;
比如说:120,2030中间无需打印零,120,0230就需要打印零。
这些问题都将在打印的时候解决。
3.1 末尾零;
因为在末尾,所以后面零的都无需打印;
前面提到倒序打印数组,所以只要找到末尾有几个位子不用管就行,包括数字和计数单位。
//调用函数计算不用打印的个数。
int lin(char ch[]) {//句末的零个数。
int i = 0;
while (ch[i] == 'a') {
i += 2;
}
return (i - 1);
}
3.2.中间零;
有两件要确定的事情;
(1).无论中间有多少个零,只需要打印一个零,直到遇到非零;
那么可以猜测打印这个零的条件,下一位数字不为零;
并且当遇到120,2000这种情况的中间零无需打印,而120,0200才需要打印。
(2).跳过中间零的时候有可能跳过万位。
int mon = 0, cat = 0;
if (ch_ljl[0] == 'a') {
mon = lin(ch_ljl);
}
for (i = j; i >= mon; i--) {
if (ch_ljl[i] == 'a') {
cat = 2;
//变量cat有一种倒计时的意思,
//每遇到中间零的时候,跳过两个循环
if (ch_ljl[i - 2] != 'a'&&ch_ljl[i-1]!='W') {
//当下一个数字非零,并且(i-1)项并非万位时,打印一个零
//因为120,2300的情况无需打印零。
printf("a");
}if ((i-1) == 7) {
printf("W");
//在第一个if语句下,已经是跳过了万位,所以需要补上。
}
}
if (cat != 0) {
cat--;
continue;
}
printf("%c", ch_ljl[i]);
}
4.完整代码如下。
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
if (n == 0) {//考虑输入为零的情况
printf("a");
}
else {
char ch_digit[11] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
char ch_unit1[4] = { 'S','B','Q' };
char ch_unit2[3] = { 'W','Y' };
char ch_ljl[100];//存储字母。
int i, j = 0;
int stu = 0, we = 0;
//j:总位数;stu:单位位数;we:数字位数。
while (n) {
i = n % 10;
ch_ljl[j] = ch_digit[i];
n /= 10;//当n等于零时,已经无需打印位数。
if (n == 0) {
break;
}
j++;
we++;
if (we < 4 || (we > 4 && we < 8) || we>8) {
ch_ljl[j] = ch_unit1[stu];
stu++;
j++;
}
else if (we == 4) {
ch_ljl[j] = ch_unit2[0];
stu = 0;
j++;
}
else if (we == 8) {
ch_ljl[j] = ch_unit2[1];
stu = 0;
j++;
}
}
//输出打印部分
int mon = 0, cat = 0;
if (ch_ljl[0] == 'a') {
mon = lin(ch_ljl);
}
for (i = j; i >= mon; i--) {//倒序打印,句末的零无需打印
if (ch_ljl[i] == 'a') {
cat = 2;
if (ch_ljl[i - 2] != 'a'&&ch_ljl[i-1]!='W') {
printf("a");
}if ((i-1) == 7) {
printf("W");
}
}
if (cat != 0) {
cat--;
continue;
}
printf("%c", ch_ljl[i]);
}
}
printf("\n");
return 0;
}
int lin(char ch[]) {//句末的零个数。
int i = 0;
while (ch[i] == 'a') {
i += 2;
}
return (i - 1);
}