天天看點

PAT (Advanced Level) A1082 Read Number in Chinese 解題報告PAT (Advanced Level) A1082解題報告

PAT (Advanced Level) A1082解題報告

題目連結1082 Read Number in Chinese

注意點:

  • 億 萬 千 百 十這些機關的輸出
  • 零的輸出(當零與非零相鄰時輸出,多個0隻輸出1個0,末尾的0不輸出)
  • 空格的輸出(用vector将要輸出的字元儲存起來,再進行格式化輸出)
  • 特殊情況的處理(如個位數)

一個一個測試點debug的過程:

送出1st 9分
PAT (Advanced Level) A1082 Read Number in Chinese 解題報告PAT (Advanced Level) A1082解題報告
  • 測試點3為段錯誤

    段錯誤一般情況下為數組越界等。

    然後發現我在特殊處理個位數情況的時候,printf之後沒有直接return,是以進行了最後對于vector的格式化輸出(而vector未經初始化,通路res[0]這種操作會産生段錯誤)

送出2rd 12分
PAT (Advanced Level) A1082 Read Number in Chinese 解題報告PAT (Advanced Level) A1082解題報告
  • 測試點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;

}