PAT (Advanced Level) Practice 1082 Read Number in Chinese (25 分)(C++)(甲级)

1082 Read Number in Chinese (25 分)
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output Fu first if it is negative. For example, -123456789 is read as Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu. Note: zero (ling) must be handled correctly according to the Chinese tradition. For example, 100800 is yi Shi Wan ling ba Bai.

Input Specification:

Each input file contains one test case, which gives an integer with no more than 9 digits.

Output Specification:

For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.

Sample Input 1:

-123456789
Sample Output 1:

Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Input 2:

100800
Sample Output 2:

yi Shi Wan ling ba Bai


//感觉本题可能有很多人会因为自己读得不正确然后做错;而且本题逻辑比较难写
//这里大概能把以下几个测试用例通过应该没啥问题了;当然还要考虑负数
//0 零
//10 一十
//101一百零一
//100001 一十万零一
//10000000 一千万
//100000001 一亿零一
//101000001 一亿零一百万零一


#include <cstdio>
#include <cstring>
#include <cmath>

int main()
{
	int N = 0;
	char num[12][10] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu", "\0" };
	int S[10] = { 0 };
	int top = -1;
	scanf("%d", &N);
	if (!N) printf("ling");//输入为0直接打印了
	if (N < 0)//输入为负打印fFu,并取绝对值
	{
		N = -N;
		printf("Fu ");
	}
	while (N)//把N的各位数字放入栈中
	{
		S[++top] = N % 10;
		N /= 10;
	}
	int i=0, first = 1, last = 1;
	while (top >= 0)//打印出来;这里一定要小心0️⃣的打印!!!
	{
		if (!S[top])//出现0️⃣之后继续向后扫描再决定要不要输出ling
		{
			for (i = top; i >= 0 && !S[i] && i != 4; i--);
			if ((i+1) % 4 && i!=4) printf(" ling");
			if (i < 0) return 0;
			top = i;
		}
		else last = top;//上次非零位置
		if (top == 4 && last != 8)
		{
			if (S[top])
			{
				if (first) printf("%s Wan", num[S[top]]), first = 0;//控制输出格式
				else printf(" %s Wan", num[S[top]]);
			}
			else printf(" Wan", num[S[top]]);//注意单位首字母是大写,而数字的字母都是小写
		}
		else if(S[top])
		{
			if (first) printf("%s", num[S[top]]), first = 0;
			else printf(" %s", num[S[top]]);
		}
		if (top % 4 == 1) printf(" Shi");
		if (top % 4 == 2) printf(" Bai");
		if (top % 4 == 3) printf(" Qian");
		if (top == 8) printf(" Yi");
		top--;
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值