PAT 1082 字符串问题

题目

把一串数字,用中文拼音输出

代码及思路

  1. 题目中说明了数字长度不超过九位数,所以可以很简单的划分长度,前五位和后四位
  2. 可以发现,除了前五位和后四位之间的过渡有个“Wan”和如果有第九位就会有个“Yi”以外,他们在十百千上的输出逻辑是相通的
  3. 建立两个二维字符类型的数组,直接存储好每个数字后面所需要输出的单位
  4. 比如123456789,它们分别就是亿千百十万千百十,这样的话用单位数组对应的下标来分别记录他们的单位
  5. 然后就到了输出部分,可以看到题目中给的一个Sample为100800,可以发现,如果一个数字后面都是0,则输出完本身的数字和单位后就停止,然后根据是否在“万”以前和“万”以后来决定循环的进行是终止还是直接跳到千位,所以需要在循环的过程中建立一个flagwan来记录当前的位数是否是在“万”之前还是之后。
  6. 如果一个数字本身是0,则只输出0不输出单位
  7. 剩下的问题就是coding的边界问题了,比如为0的时候下一步跳到哪里,主要是对于i的位置的判断,还有因为分成两段,所以判0的长度的下标也需要根据当前的位置动态变化,这个题好像最难的地方就是边界问题和跳转问题
#include<cstdio>
#include<string>
#include<iostream>
#include<math.h>
using namespace std;

char num[10][5] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
char dim[5][5] = { "Yi","Qian", "Bai", "Shi", "Wan" };

int main() {
	string str;
	cin >> str;
	int flag[9];
	int flagwan = true;
	if (str[0] == '-') {
		str.erase(str.begin());
		printf("Fu ");
	}
	int lenth = str.length();
	int j = 3;
	for (int i = lenth - 2; i >= 0; i--) {
		flag[i] = j;
		j--;
		if (j == 0 && flagwan) {
			j = 3;
			i--;
			flag[i] = 4;
			flagwan = false;
		}
		else if (j == 0 && !flagwan) {
			j = 3;
			i--;
			flag[i] = 0;
			flagwan = false;
		}
	}
	if (lenth >= 5) flagwan = true;
	else flagwan = false;
	int poszero;
	for (int i = 0; i < lenth; i++) {
		if (i <= lenth - 5) poszero = lenth - 5;
		else poszero = lenth - 1;
		bool flagzero = true;
		int tempi = i + 1;
		int index = str[i] - '0';
		if (flagwan) { // 在万之前的
			while (tempi <= poszero) {
				if (str[tempi] != '0') {
					flagzero = false;
					break;
				}
				tempi++;
			}
			if (!flagzero) { //后面不全为0
				if (index == 0) { printf("%s", num[0]); }
				else {
					printf("%s %s", num[index], dim[flag[i]]);
				}
			}
			else if (flagwan && lenth - i - 1 == 4) {
				printf("%s Wan", num[index]);
				flagwan = false;
			}
			else if (flagzero) { //后面全是0
				printf("%s %s Wan", num[index], dim[flag[i]]);
				flagwan = false;
				i = lenth - 5;
			}
			printf(" ");
		}
		else { //在万之后的
			while (tempi <= poszero) {
				if (str[tempi] != '0') {
					flagzero = false;
					break;
				}
				tempi++;
			}
			if (!flagzero) { //后面不全为0
				if (index == 0) { printf("%s", num[0]); }
				else {
					printf("%s %s", num[index], dim[flag[i]]);
				}
			}
			else if (i == lenth - 1) {
				printf("%s", num[index]);
				break;
			}
			else if (flagzero) { //后面全是0
				printf("%s %s", num[index], dim[flag[i]]);
				break;
			}
			if (i != lenth - 1) printf(" ");
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值