学习目标:
7-23 币值转换
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
下面展示–》 代码
。
#include<stdio.h>
#define MaxSize 50
char convert(char c);
int main() {
//N代表输入的值,n代表N的临时值,m代表模除之后的余数,tag标记前一个处理的数是不是0(0:不是,1:是)
int N, n, m = 0, j = 0, tag = 0;
int money[MaxSize] = { 0 };
//输入数字N
scanf("%d", &N);
//输入的数字为零的时候直接打印
if (N == 0) {
printf("a");
return 0;
}
n = N;
//将输入的所有数字都存储在数组中,包括0,且用10000和100000000来标识亿、万、千
//以 102345000为例子,数组中存的{0,0,0,5,10000,4,3,2,0,100000000,1}
while (n != 0) {
m = n % 10;
if (j == 4) {
money[j++] = 10000;
}
if (j == 9) {
money[j++] = 100000000;
}
money[j++] = m;
n = n / 10;
}
for (int s = j - 1; s >= 0; s--) {
if (money[s] == 10000) {
printf("W");
//tag重新标识(100020 读作十万零二十,以万为单位的数‘0020’,’2‘前边的0是要读的)
tag = 0;
}
else {
if (money[s] == 100000000) {
printf("Y");
//tag重新标识(100020 读作十万零二十)
tag = 0;
}
else {
//如果连续存在多个0,则只输出一个,用tag区分(0:前一个元素非零,1:前一个元素是零)
if (money[s] == 0 && tag == 0) {
int t = s;
int tag3 = 0;//截至10000或100000000前是否有非0数,如果有,则tag3 = 1
while (t >= 0 && money[t] != 10000 && money[t] != 100000000) {
if (money[t] != 0) {
tag3 = 1;
break;
}
t--;
}
//如果靠近10000或100000000前有连续的多个0,一个也不输出,反之,则输出。(Example:5200 结尾的两个零一个也不读)
if (tag3 != 0) {
printf("a");
}
tag = 1;
}
//元素不为零的时候
if (money[s] != 0) {
//首先更改标记,表示当前位置非零,下一次进行判断的时候使用
tag = 0;
printf("%c", convert((char)money[s] + 48));
int l = s, k = 0;
//用于判断该位置是第几个(不超过四)
while (money[l] != 10000 && money[l] != 100000000 && l >= 0) {
l--;
k++;
}
switch (k) {
case 2: printf("S"); break;
case 3: printf("B"); break;
case 4: printf("Q"); break;
}
}
}
}
}
return 0;
}
char convert(char a) {
switch (a) {
case '1': return 'b';
case '2': return 'c';
case '3': return 'd';
case '4': return 'e';
case '5': return 'f';
case '6': return 'g';
case '7': return 'h';
case '8': return 'i';
case '9': return 'j';
}
}