PAT A1082 2019.07.16 【string】

这道题目要求将输入的不超过9位数的整数按中国传统方式读出来。需要注意负数、零的读法以及个、万的处理。通过使用栈来存储数字并判断是否需要添加'零'的读音。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的判断。核心操作为用栈来存取每一位数字

加不加零(只要出现0就置位标志位,直到下一个非零数字出现打印ling并复位)

注意 个 、万 和 亿是需要特别注意的(此题只考了个、万)

关于中国叫法的判断问题很琐碎,这里就不再说明

 

#include<cstdio>
#include<iostream>
#define ZERO 0
#define NONZERO 999 

int main()
{
	
	long long int n;
	scanf("%lld",&n);
	if(n<0)
	{
		printf("Fu ");
		n = 0-n;
	}
	
	if(n==0)
    {
        printf("ling");
        return 0;
    }
    
    if(n>=100000000) 
    {
    	int i=n/100000000;
		if(i == 1)printf("yi Yi");
		if(i == 2)printf("er Yi");
		if(i == 3)printf("san Yi");
		if(i == 4)printf("si Yi");
		if(i == 5)printf("wu Yi");
		if(i == 6)printf("liu Yi");
		if(i == 7)printf("qi Yi");
		if(i == 8)printf("ba Yi");	
		if(i == 9)printf("jiu Yi");
		n=n-100000000*i;
		if(n>0)printf(" ");
		if(n==0)
		{
			printf("");
			return 0;
		}
	}
	
	int stack[20];
	int top=-1;
	int flag[20];
	
	int mask=0;
	while(n!=0)
	{
		stack[++top]=n%10;
		if(stack[top] == 0)
		{
			flag[top]=ZERO;
			mask=1;//有0出现 
		}
		else flag[top]=NONZERO;
		n = n/10;
	}
	
//	for(int i=top;i>=0;i--)printf("%d ",flag[i]);
//    printf("\n");
	
	//没有一位数是0 
	if(mask == 0)//没有0出现 
	for(int i=top;i>=0;i--)
	{
		if(i==0)//最后输出到个位数了 
		{
		if(stack[i] == 1)printf("yi");
		if(stack[i] == 2)printf("er");
		if(stack[i] == 3)printf("san");
		if(stack[i] == 4)printf("si");
		if(stack[i] == 5)printf("wu");
		if(stack[i] == 6)printf("liu");
		if(stack[i] == 7)printf("qi");
		if(stack[i] == 8)printf("ba");	
		if(stack[i] == 9)printf("jiu");	
		}
		else//没有到个位数 
		{
		if(stack[i] == 1)printf("yi ");
		if(stack[i] == 2)printf("er ");
		if(stack[i] == 3)printf("san ");
		if(stack[i] == 4)printf("si ");
		if(stack[i] == 5)printf("wu ");
		if(stack[i] == 6)printf("liu ");
		if(stack[i] == 7)printf("qi ");
		if(stack[i] == 8)printf("ba ");	
		if(stack[i] == 9)printf("jiu ");	
		}

		if(i==8)printf("Yi ");
		if(i==7)printf("Qian ");
		if(i==6)printf("Bai ");
		if(i==5)printf("Shi ");
		if(i==4)printf("Wan ");
		if(i==3)printf("Qian ");
		if(i==2)printf("Bai ");
		if(i==1)printf("Shi ");
		//i为个位数的时候不用输出 Ge 
		
	}
	
	//有0出现 
	if(mask == 1)
	{
		if(top<=3)//没有超过万 
		{
			int temp=0;//是否有0的标志位 
			for(int i=top;i>=0;i--)
			{
				if(i==top)//先打印第一位 
				{
					if(stack[i] == 1)printf("yi");
					if(stack[i] == 2)printf("er");
					if(stack[i] == 3)printf("san");
					if(stack[i] == 4)printf("si");
					if(stack[i] == 5)printf("wu");
					if(stack[i] == 6)printf("liu");
					if(stack[i] == 7)printf("qi");
					if(stack[i] == 8)printf("ba");	
					if(stack[i] == 9)printf("jiu");
					if(i==3)printf(" Qian");
					if(i==2)printf(" Bai");
					if(i==1)printf(" Shi");
				}
				else if(stack[i]==0)temp=1;
				else
				{
					if(temp ==1)
					{
						printf(" ling");
						temp=0;
					}
					if(stack[i] == 1)printf(" yi");
					if(stack[i] == 2)printf(" er");
					if(stack[i] == 3)printf(" san");
					if(stack[i] == 4)printf(" si");
					if(stack[i] == 5)printf(" wu");
					if(stack[i] == 6)printf(" liu");
					if(stack[i] == 7)printf(" qi");
					if(stack[i] == 8)printf(" ba");	
					if(stack[i] == 9)printf(" jiu");
					if(i==3)printf(" Qian");
					if(i==2)printf(" Bai");
					if(i==1)printf(" Shi");	
				} 
			} 
		} 
		
		if(top>=4&&top<8)//超过万 不过E 
		{
			
			int temp=0;//是否有0的标志位 
			for(int i=top;i>=0;i--)
			{
				if(i==top)//先打印第一位 
				{
					if(stack[i] == 1)printf("yi");
					if(stack[i] == 2)printf("er");
					if(stack[i] == 3)printf("san");
					if(stack[i] == 4)printf("si");
					if(stack[i] == 5)printf("wu");
					if(stack[i] == 6)printf("liu");
					if(stack[i] == 7)printf("qi");
					if(stack[i] == 8)printf("ba");	
					if(stack[i] == 9)printf("jiu");
//					if(i==8)printf(" Yi");
					if(i==7)printf(" Qian");
					if(i==6)printf(" Bai");
					if(i==5)printf(" Shi");
					if(i==4)printf(" Wan");
					if(i==3)printf(" Qian");
					if(i==2)printf(" Bai");
					if(i==1)printf(" Shi");
				}
				
				else 
				if(stack[i]==0)
				{
					temp=1;
					if(i==4)printf(" Wan");
				}
				else
				{
					if(temp ==1)
					{
						printf(" ling");
						temp=0;
					}
					if(stack[i] == 1)printf(" yi");
					if(stack[i] == 2)printf(" er");
					if(stack[i] == 3)printf(" san");
					if(stack[i] == 4)printf(" si");
					if(stack[i] == 5)printf(" wu");
					if(stack[i] == 6)printf(" liu");
					if(stack[i] == 7)printf(" qi");
					if(stack[i] == 8)printf(" ba");	
					if(stack[i] == 9)printf(" jiu");
					if(i==7)printf(" Qian");
					if(i==6)printf(" Bai");
					if(i==5)printf(" Shi");
					if(i==4)printf(" Wan");
					if(i==3)printf(" Qian");
					if(i==2)printf(" Bai");
					if(i==1)printf(" Shi");
				} 
			} 
			
		} 	
		
	} 
		
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值