1082. Read Number in Chinese (25)

//http://www.patest.cn/contests/pat-a-practise/1082
#include<cstdio>
#include<cstring>
using namespace std;

int main(){
	int digit;
	const char dig[4][5] = { "Qian","" ,"Shi","Bai" };
	const char digg[][10] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
	char str[15];
	int zero=0,els=0;
	int start;
	int num,yi,wan,length;

	zero = 0; els = 0;
	scanf("%d", &num);
	if (num == 0){//唯一的特殊情况
		printf("ling");
		return 0;
	}
	if (num < 0){
		printf("Fu ");
		num = -num;
	}
	sprintf(str, "%d", num);//转换为字符串
	length = strlen(str);
	yi = length >8 ? 0 : -1;//总位数大于8,则当第0位输出后,需要输出“亿”
	wan = length > 8 ? 4 : (length > 4 ? (length - 1) % 4 : -1);//总位数大于4且大于8,则第4位输出后需要输出“万”,总位数>4,<8则需要在length-1 % 4后输出“万”

	start = length % 4;
	for (digit = 0; digit < length; digit++){
		if (str[digit] - '0' == 0){//遇到零不能输出ling,因为如果是末位的ling呢?只有当再次遇到非零的数时,才能输出此位的ling
			zero = 1;//标记已经遇到过零了,因此当再次遇到别的数字时要输出ling
		}
		else {
			els = 1;//遇到了非零的数字,后面决定是否要输出万,如数字1 0000 2345,没有别的数字,不能输出wan
			if (zero == 1){
				zero = 0;
				if (digit != 0)
					printf(" ");
				printf("ling");//遇到ling后又遇到了非零的数字
			}
			if (digit != 0)
				printf(" ");
			printf("%s", digg[str[digit] - '0']);//输出Bai,Qian等
			if (start != 1)
				printf(" ");
			printf("%s", dig[start]);
		}
		start--;//start标记此位输出后应该输出Bai,还是Qian,还是Shi,如100,1000,10
		if (start < 0)
			start = 3;
		if (digit == wan && els == 1){<span style="font-family: Arial, Helvetica, sans-serif;">//</span><span style="font-family: Arial, Helvetica, sans-serif;">如数字1 0000 2345,没有别的数字,不能输出wan</span>
			printf(" Wan");
			zero = 0;
			els = 0;
		}
		else if (digit == yi && els == 1){ 
			printf(" Yi");
			zero = 0;
			els = 0;
		}
	}
	printf("\n");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值