自己想的这个方法,条件判断起来比较麻烦。由于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;
}