PAT甲级1082

1082 Read Number in Chinese (25 point(s))

  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

题目大意

  给定一个数字,要求用拼音的方式打印出来,题意很好懂,看示例就明白了

解题思路

  对于本题,我写了2个多小时,但测试点3始终无法通过,无奈参考了算法笔记上的代码,对照注释也很好理解

代码

#include <iostream>
#include <string>
using namespace std;

string chineseNums[10] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
string wei[5] = { "Shi", "Bai", "Qian", "Wan", "Yi" };
int main()
{
	string num;
	cin >> num;
	int len = num.size();
	int left = 0, right = len - 1;
	if (num[0] == '-') {//若为负,则输出Fu,并将left右移
		printf("Fu");
		++left;
	}	
	while (left + 4 <= right) {
		right -= 4;		
	}
	while (left < len) {
		int isPrint = 0;//表示该部分未输出过
		int flag = 0;//是否累积有0
		while (left <= right) {
			if (left > 0 && num[left] == '0') {//若当前位为0
				flag = 1;
			}
			else {//若当前位不为0
				if (flag) {//如果存在累积0
					printf(" ling");
					flag = 0;
				}
				if (left > 0) printf(" ");//只要不是首位,则都要输出空格
				isPrint = 1;//置为已输出过
				cout << chineseNums[num[left] - '0'];//打印对应数字
				if (left != right) cout << " " << wei[right - left - 1];//只要不是个位,要输出十百千			
			}
			++left;
		}
		if (isPrint && right != len - 1) {//只要不是个位,输出万or亿
			cout << " " << 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、付费专栏及课程。

余额充值