PAT-A1082 Read Number in Chinese (中文读数字)

A1082 Read Number in Chinese (中文读数字)

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,2345,6789

每四位分为一节,一共分为三节,如果是负数,那么先输出 “Fu”

通过 “双指针”思想,设立left和right,借次更好的进行数字间的移动。

right每次左移四位,直到和left在同一节 ,如果有累计的零,那么就只输出一个 “ling”,只要不是首位,就要输出空格,再输出当前数字,当left!=right的时候,输出十百千,只要不是个位,就输出万/亿 ,right每次+4。

代码如下:

#include<cstdio>
#include<string.h>
char num[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char wei[5][5]={"Shi","Bai","Qian","Wan","Yi"};
int main(){
	char str[20];
	scanf("%s",&str);
	int len=strlen(str);
	int left=0,right=len-1;
	bool flag;
	bool isprint;
	if(str[0]=='-'){
		printf("Fu");
		left++;
	}
	while(left+4<=right){
		right-=4;//right每次左移四位,直到和left在同一节 
	}

	while(left<len){
		flag=false;//没有累积的0
		isprint=false;//该节没有输出过位
		while(left<=right){
			//特判0 
			if(left>0&&str[left]=='0'){
				flag=true;//当前位是0 
			}else{
				if(flag){
					printf(" ling");
					flag=false;
				}
			//只要不是首位,就要输出空格
			if(left>0) printf(" ");
			printf("%s",num[str[left]-'0']);//输出当前数字
			isprint=true;
			if(left!=right){
				printf(" %s",wei[right-left-1]);//输出个十百千 
			} 
		} 
		left++;
	}
	if(isprint==true&&right!=len-1){//只要不是个位,就输出万/亿 
		printf(" %s",wei[(len-1-right)/4+2]);
	}
	right+=4;
}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值