PAT 1082 Read Number in Chinese [字符串处理] [数字分位读法]

该博客详细介绍了如何解决PAT 1082题目的问题,即根据中国传统方式读取数字。内容涉及如何处理负数、逗号分隔的数字以及零的特殊读法。博主通过实例解析了读数规则,并分享了处理零的输出技巧,强调了在处理负数时大小写的注意事项。
摘要由CSDN通过智能技术生成

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

---------------------------------------这是题目和解题的分割线--------------------------------------

这首先要搞清楚怎么读数字,我一般是从右到左“个十百千万”...这样就导致看到题目很萌比,搜罗了一圈才发现,我平时真是太不善于观察了。1,0000、1,2345,6789 ,这样的逗号分隔有没有很常见!这道题就是要这样处理,四位划分。

比如说1234,5678,从高位开始读,先读局部,输出数字(只要不是局部末尾比如4比如8)再输出位数,所以1234读出来是 yi Qian er Bai san Shi si ,局部读完,(只要不是整体末尾比如8)输出位数,那就变成了 yi Qian er Bai san Shi si Wan 。后面依葫芦画瓢就ok~ 

但还有一点需要特别处理一下,0应该怎么读?思考至此我再次愣住,平时就那样读啊,这是常识,哪儿来那么多弯弯绕绕= = 

还是用个具体的例子来说明吧!100800——yi Shi Wan ling ba Bai。

这里出现了四个零,但只有第二个零是读出来了的。因为其余三个都包括在了位数(Wan、Bai)中。(在参考了别人的代码以后)可以想到(ps:这里找不到链接了不好意思),零的输出如果放在下一次的循环会让事情变得简单很多~ 设置一个标记,if 如果当前数字是0,标志置为1,并不作任何输出。else 加上一个判断,如果标记为1,输出ling。一定要是if和else的非此即彼关系,不然800尾巴上两个零不会被筛出去。更具体的还是看代码吧!

(这么简单的事我居然说了这么多...全网大概又是只有我不懂吧...所以必须写下来,不然以后万一忘了也没人参考)

啊对,还有测试点0和测试点4的数据是负数,不是fu是Fu,大小写一定要注意!!!

#include<cstdio>
#include<cstring>

int main()
{
	char str[15];
	char num[15][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	char wei[10][5] = {"Shi","Bai","Qian","Wan","Yi"};
	scanf("%s",str);
	//i是当前值,j是局部(逗号)位置 
	int len = strlen(str),i = 0,j = len-1;
	//特殊值0的判断 
	if(len==1&&str[0]=='0')
	{
		printf("ling");
		return 0;
	}
	//如果是负数,指针往前走一步 
	if(str[0]=='-')
	{
		printf("Fu");
		i++;
	}
	//从左往右读,所以j得找到最左边的逗号 
	while(i<=j-4)
		j -= 4;
	//零的标记号 
	bool flag = false;
	//没遍历完该数字 
	while(i<=len-1)
	{
		//每个局部,零标志都要初始化一下 
		flag = false;
		//局部输出 
		while(i<=j)
		{	
			//如果当前值是0,留到下一次处理 
			if(str[i]=='0') flag = true;
			//一定要有else,因为当前值为0的话什么都不要动 
			else
			{
				//如果上一次是0,这一次还能进循环,说明可输出 
				if(flag) 
				{
					printf(" ling");
					flag = false;
				}
				//数字前空格的输出,只要不是第一个数字都行 
				if(i!=0) printf(" ");
				printf("%s",num[str[i]-'0']);
				//位数前空格一律输出,因为位数前一定有空格 
				if(i!=j) printf(" %s",wei[j-i-1]);
				//j-i-1对应wei数组中位数的名称
				//i!=j,因为局部位置的个位数不需要位数输出 
			}
			i++; //记得加1	
		}
		//如果不是数字的末尾,输出位数 
		if(j!=len-1) printf(" %s",wei[(len-j)/4+2]);
		j += 4; //局部位置+4 
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值