1082 Read Number in Chinese (25分)/数学模拟

自己想的这个方法,条件判断起来比较麻烦。由于PAT网站上的测试用例比较少,AC代码拿到牛客网上不能AC,牛客网上测试用例比较刁钻,对着错误的用例才把程序修改得完全正确。下面的代码change函数里面第一个if语句去掉都可以在PAT上AC,但是在牛客上不能AC。

这个方法有点难以处理细节,主要是由于“Wan”比较特殊,如果只有四位用这个方法会非常方便。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
string s[9] = { "","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi" }; //对应位置该输出的位数
string shuzi[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
vector<string> an; //anwser
int num;
void change(int n) {
	int a[9] = { 0 };
	while (n > 0) {
		a[num] = n % 10;
		n = n / 10;
		if (num == 8 && an[an.size() - 1] == "Wan") { //如果有亿位了,而万-千万位都是0
			an.pop_back(); //去掉"Wan"
			if (an[an.size() - 1] != "ling"&&an.size() > 0) an.push_back("ling"); //如果还有非零位,且末尾不是"ling"则要补"ling",因为万-千万位都是0
		}
		if (a[num] != 0){
			if (num == 0) an.push_back(shuzi[a[num]]);  //需要与下行区分开是由于中间的空格会导致格式错误
			else an.push_back(shuzi[a[num]] + " " + s[num]);
		}
		else if (num == 4) an.push_back("Wan");  //不管万位是不是0都输出"Wan"
		else if (an.size()>0&&an[an.size()-1]!=shuzi[0]&& an[an.size() - 1] != "Wan") an.push_back(shuzi[0]); //!="wan"是为了避免"ling wan"的出现
		num++;
	}
}
int main() {
	int n; cin >> n;
	if (n == 0) {
		cout << "ling";
		return 0;
	}
	if (n < 0) {
		cout << "Fu ";
		n = 0 - n;
	}
	change(n);
	for (int i = an.size() - 1; i >= 0; i--) {
		cout << an[i];
		if (i != 0) printf(" ");
	}
	return 0;
}

利用测试点数据的漏洞,下面的改法也AC了,但是在牛客网上有几个测试无法通过,还有一点点小问题。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
string s[4] = { ""," Shi"," Bai"," Qian"}; //对应位置该输出的位数
string shuzi[10] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
void change(int n) {
	int a[4] = { 0 }, num=0;
	vector<string> an; //anwser
	while (n > 0) {
		a[num] = n % 10;
		n = n / 10;
		if (a[num] != 0) {
			an.push_back(shuzi[a[num]] + s[num]);
		}
		else if (an.size()>0&&an[an.size()-1]!="ling") an.push_back("ling");
		num++;
	}
	for (int i = an.size() - 1; i >= 0; i--) {
		cout << an[i];
		if (i != 0) printf(" ");
	}
}
int main() {
	int n; cin >> n;
	if (n == 0) {
		cout << "ling";
		return 0;
	}
	if (n < 0) {
		cout << "Fu ";
		n = 0 - n;
	}
	int yiwei=n/100000000, wanwei=n/10000%10000, diwei=n%10000;
	if (yiwei > 0) {
		cout << shuzi[yiwei] << " Yi ";
		if (wanwei < 1000) cout << "ling";
	}
	if (wanwei > 0) {
		change(wanwei); cout << " Wan ";
		if (diwei < 1000) cout << "ling ";
	}
	change(diwei);	
	return 0;
}
发布了62 篇原创文章 · 获赞 7 · 访问量 3130

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104119041