PAT1082. Read Number in Chinese

https://www.patest.cn/contests/pat-a-practise/1082

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

此题天坑,据说是姥姥前期出题控制不好难度导致。最后用很丑陋的方法写出来了。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
 
int main() {
	char n[15] = { 0 };
	int d,j;
	gets_s(n);
	char a[4][5] = { "Wan","Shi","Bai","Qian"};
	char b[10][5] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
	bool f1=false ,f2=false,f3=false;
	int l = strlen(n),p=0;
	if (n[0] == '-') {
		printf("Fu ");
		for (int i = 1; i < l; i++)
			n[i - 1] = n[i];
		n[l - 1] = '\0';
		l--;	
	}
	for (int i = 0; i < l; i++) {
		d = n[i] - '0';
		j = l - i;
		int dw = (j - 1)/4,dw2=(j-1)%4;
		if (dw == 2) {
		 
			printf("%s", b[d]);
			printf(" Yi");
		}
		else if (dw == 1) {
			if (d == 0) {
				f1 = true;
				if (f2&&dw2 == 0) printf(" Wan");
				continue;
			}
			else {
				f2 = true;
				if (f1) { 
					printf(" ling"); 
					f1 = false;
				}
				if (i != 0) printf(" ");
				printf("%s", b[d]);
				printf(" %s", a[dw2]);
			}

		}
		else if (dw == 0) {
			if (d == 0) {
				if (l==1) printf("ling");
				f3 = true;
				continue;
			}
			else {
				if (f3) {
					printf(" ling");
					f3 = false;
				} 
				if (i != 0) printf(" ");
				printf("%s", b[d]);
				if(dw2!=0) printf(" %s", a[dw2]);
			}
		}






	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值