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應該也會出現,後來我發現是機關輸出的問題。
PAT (Advanced Level) A1082 Read Number in Chinese 解題報告PAT (Advanced Level) A1082解題報告 我在最後的機關會輸出"",而這個加到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;
}