PAT 乙級真題題解1001~1005

1001. 害死人不償命的(3n+1)猜想 (15)-PAT乙級真題

卡拉茲(Callatz)猜想:
對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;
如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,
最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公佈
了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似
很傻很天真的命題,結果鬧得學生們無心學業,一心只證(3n+1),
以至於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……

我們今天的題目不是證明卡拉茲猜想,而是對給定的任一不超過1000的正整數n,
簡單地數一下,需要多少步(砍幾下)才能得到n=1?
輸入格式:
每個測試輸入包含1個測試用例,即給出自然數n的值。
輸出格式:
輸出從n計算到1需要的步數。
輸入樣例:
3
輸出樣例:
5
#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int count = 0;
    while (n != 1) {
        if (n % 2 != 0) {
            n = 3 * n + 1;
        }
        n = n / 2;
        count++;
    }
    cout << count;
    return 0;
}

1002. 寫出這個數 (20)-PAT乙級真題

讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裏保證n小於10100。
輸出格式:
在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後一個拼音    數字後沒有空格。
輸入樣例:
1234567890987654321123456789
輸出樣例:
yi san wu
#include <iostream>

using namespace std;

int main() {
    string s;
    cin >> s;
    unsigned long len;
    len = s.length();
    int *a;
    a = new int[len];
    int sum = 0;
    string str[10] = {
            "ling",
            "yi",
            "er",
            "san",
            "si",
            "wu",
            "liu",
            "qi",
            "ba",
            "jiu"
    };

    for (int i = 0; i < len; ++i) {
        a[i] = s[i] - '0';
        sum = sum + a[i];
    }
    int *b;
    b = new int[len];
    int j = 0;
    if (sum == 0) {
        cout << "ling";
    } else {
        while (sum != 0) {
            b[j++] = sum % 10;
            sum = sum / 10;
        }
    }
    for (int k = j - 1; k >= 1; k--) {
        cout << str[b[k]] << " ";
    }
    cout << str[b[0]];
    delete[] a;
    delete[] b;

    return 0;
}

1003. 我要通過!(20)-PAT乙級真題

“答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於PAT的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。
得到“答案正確”的條件是:
1. 字符串中必須僅有P, A, T這三種字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以獲得“答案正確”,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串;
3. 如果 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a, b, c 均或者是空字符串,或者是僅由字母 A 組成的字符串。
現在就請你爲PAT寫一個自動裁判程序,判定哪些字符串是可以獲得“答案正確”的。
輸入格式:
每個測試輸入包含1個測試用例。第1行給出一個自然數n (<10),是需要檢測的字符串個數。接下來每個字符串佔一行,字符串長度不超過100,且不包含空格。
輸出格式:
每個字符串的檢測結果佔一行,如果該字符串可以獲得“答案正確”,則輸出YES,否則輸出NO。
輸入樣例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
輸出樣例:
YES
YES
YES
YES
NO
NO
NO
NO
#include <iostream>

using namespace std;

bool judge(string str) {
    unsigned long len;
    len = str.length();
    if (len <= 2)
        return false;
    bool book[3] = {false};
    for (int i = 0; i < len; i++) {
        if(str[i] == 'P')
            book[0] = true;
        else if(str[i] == 'A')
            book[1] = true;
        else if(str[i] == 'T')
            book[2] = true;
        else
            return false;
        if (str[i] == 'P') {
            for (int j = 0; j < i; j++) {
                if (str[j] != 'A')
                    return false;
            }
            if (str [i+1] != 'A')
                return false;
            for (int k = i + 2; k < len; k++) {
                if (str[k] != 'A') {
                    if (str[k] != 'T') {
                        return false;
                    }
                    if ((len - 1 - k) != ((k - 1 - i) * i))
                        return false;
                    for (int m = k + 1; m < len; m++) {
                        if (str[m] != 'A')
                            return false;
                    }
                }
            }
        }
    }
    return !(!book[0] || !book[1] || !book[2]);
}

int main() {
    int n;
    cin >> n;
    string s;
    for(int i = 0; i < n; i++) {
        cin >> s;
        if(judge(s))
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

1004. 成績排名 (20)-PAT乙級真題

讀入n名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。
輸入格式:每個測試輸入包含1個測試用例,格式爲
第1行:正整數n
第2行:第1個學生的姓名 學號 成績
第3行:第2個學生的姓名 學號 成績
… … …
第n+1行:第n個學生的姓名 學號 成績
其中姓名和學號均爲不超過10個字符的字符串,成績爲0到100之間的一個整數,這裏保證在一組測試用例中沒有兩個學生的成績是相同的。
輸出格式:對每個測試用例輸出2行,第1行是成績最高學生的姓名和學號,第2行是成績最低學生的姓名和學號,字符串間有1空格。
輸入樣例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
輸出樣例:
Mike CS991301
Joe Math990112
#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    int max = -1, min = 101, score;
    string maxName, minName, maxNum, minNum, name, num;
    for (int i = 0; i < n; ++i) {
        cin >> name;
        cin >> num;
        cin >> score;
        if (max < score) {
            max = score;
            maxName = name;
            maxNum = num;
        }
        if (min > score) {
            min = score;
            minName = name;
            minNum = num;
        }
    }

    cout << maxName << " " << maxNum << endl << minName << " " << minNum;

    return 0;
}

1005. 繼續(3n+1)猜想 (25) PAT乙級真題

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裏,情況稍微有些複雜。
當我們驗證卡拉茲猜想的時候,爲了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進行驗證的時候,就可以直接判定卡拉茲猜想的真僞,而不需要重複計算,因爲這4個數已經在驗證3的時候遇到過了,我們稱5、8、4、2是被3“覆蓋”的數。我們稱一個數列中的某個數n爲“關鍵數”,如果n不能被數列中的其他數字所覆蓋。
現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。
輸入格式:每個測試輸入包含1個測試用例,第1行給出一個正整數K(<100),第2行給出K個互不相同的待驗證的正整數n(1<n<=100)的值,數字間用空格隔開。
輸出格式:每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用1個空格隔開,但一行中最後一個數字後沒有空格。
輸入樣例:
6
3 5 6 7 8 11
輸出樣例:
7 6
#include <iostream>
#include <algorithm>

using namespace std;

int cmp(int a, int b) {
    return a > b;
}

int main() {
    int n;
    cin >> n;
    int *a = new int[n];
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    int t;
    sort(a, a + n, cmp);
    for (int i = 0; i < n; ++i) {
        t = a[i];
        while (t != 1 && t != 999) {
            if (t % 2 == 0) {
                t = t / 2;
            } else {
                t = (t * 3 + 1) / 2;
            }
            for (int j = 0; j < n; ++j) {
                if (t == a[j] && j != i)
                    a[j] = 999;
            }
        }
    }

    sort(a, a + n, cmp);
    int temp = 0;
    for (int k = n - 1; k >= 0; --k) {
        if (a[k] != 999)
            temp = k;
    }
    for (int l = temp; l < n - 1; ++l) {
        cout << a[l] << " ";
    }
    cout << a[n - 1];

    delete[] a;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章