PAT (Advanced Level) A1082解题报告
题目链接1082 Read Number in Chinese
注意点:
- 亿 万 千 百 十这些单位的输出
- 零的输出(当零与非零相邻时输出,多个0只输出1个0,末尾的0不输出)
- 空格的输出(用vector将要输出的字符保存起来,再进行格式化输出)
- 特殊情况的处理(如个位数)
一个一个测试点debug的过程:
提交1st 9分
-
测试点3为段错误
段错误一般情况下为数组越界等。
然后发现我在特殊处理个位数情况的时候,printf之后没有直接return,因此进行了最后对于vector的格式化输出(而vector未经初始化,访问res[0]这种操作会产生段错误)
提交2rd 12分
-
测试点0和4为格式错误
格式错误自然而然就会想到空格问题,但是如果是在最后空格问题,我的测试点1和2应该也会出现,后来我发现是单位输出的问题。
我在最后的单位会输出"",而这个加到vector中最后可能会输出成空格,导致格式错误。因此我决定将单位输出不使用数组进行判定,其中的规律有很多细节,如在位数%4的余数为0时,有亿和万两种可能;当当前字符为0时,有可能输出万(如100000)……
提交3rd 21分
过了测试点0,继续debug
AC
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
string num[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
vector<string> res;
int main()
{
string str;
cin >> str;
if(str[0] == '-')
{
printf("Fu ");
str = str.substr(1);
}
int n = stoi(str);
int part2 = (n % 100000000) / 10000;
int len = str.length();
if(len == 1)
{
printf("%s", num[str[0] - '0'].c_str());
return 0;
}
else
{
for(int i = 0; i < len; i++)
{
if(str[i] != '0')
{
res.push_back(num[str[i] - '0']);
if((len - 1 - i) % 4 == 3) res.push_back("Qian");
else if((len - 1 - i) % 4 == 2) res.push_back("Bai");
else if((len - 1 - i) % 4 == 1) res.push_back("Shi");
else if((len - 1 - i) % 4 == 0)
{
if(i == 0 && len > 8) res.push_back("Yi");
else if(i != (len - 1))res.push_back("Wan");
}
}
else if(str[i] == '0')
{
if(part2 != 0 && (len - 1 - i) == 4) res.push_back("Wan");
else if(i != (len - 1) && str[i + 1] != '0') res.push_back(num[0]);
}
}
}
printf("%s", res[0].c_str());
for(int i = 1; i < res.size(); i++)
{
printf(" %s", res[i].c_str());
}
return 0;
}