C语言学习:PAT 7-83 币值转换

输入一个整数(位数不超过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);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值