PAT 乙級真題題解 1006~1011

1006. 換個格式輸出整數 (15)-PAT乙級真題

讓我們用字母B來表示“百”、字母S表示“十”,用“12…n”來表示個位數字n(<10),換個格式來輸出任一個不超過3位的正整數。例如234應該被輸出爲BBSSS1234,因爲它有2個“百”、3個“十”、以及個位的4。
輸入格式:
每個測試輸入包含1個測試用例,給出正整數n(<1000)。
輸出格式:
每個測試用例的輸出佔一行,用規定的格式輸出n。
輸入樣例1:
234
輸出樣例1:
BBSSS1234
輸入樣例2:
23
輸出樣例2:
SS123
#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    int i = 0;
    int b[3] = {0};
    while (n) {
        b[i++] = n % 10;
        n = n / 10;
    }
    for (int j = 0; j < b[2]; ++j) {
        cout << "B";
    }
    for (int k = 0; k < b[1]; ++k) {
        cout << "S";
    }
    for (int l = 1; l <= b[0]; ++l) {
        cout << l;
    }

    return 0;
}

1007. 素數對猜想 (20)-PAT乙級真題

讓我們定義 dn 爲:dn = pn+1 – pn,其中 pi 是第i個素數。顯然有 d1=1 且對於n>1有 dn 是偶數。“素數對猜想”認爲“存在無窮多對相鄰且差爲2的素數”。
現給定任意正整數N (< 105),請計算不超過N的滿足猜想的素數對的個數。
輸入格式:每個測試輸入包含1個測試用例,給出正整數N。
輸出格式:每個測試用例的輸出佔一行,不超過N的滿足猜想的素數對的個數。
輸入樣例:
20
輸出樣例:
4
#include <iostream>

using namespace std;

bool isPrime(int a) {
    for (int i = 2; i * i <= a; ++i) {
        if (a % i == 0)
            return false;
    }
    return true;
}

int main() {
    int n;
    cin >> n;
    int count = 0;
    for (int i = 5; i <= n; ++i) {
        if(isPrime(i - 2) && isPrime(i))
            count++;
    }
    cout << count;

    return 0;
}

1008. 數組元素循環右移問題 (20)-PAT乙級真題

一個數組A中存有N(N>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M(M>=0)個位置,即將A中的數據由(A0 A1……AN-1)變換爲(AN-M …… AN-1 A0 A1……AN-M-1)(最後M個數循環移至最前面的M個位置)。如果需要考慮程序移動數據的次數儘量少,要如何設計移動
的方法?
輸入格式:每個輸入包含一個測試用例,第1行輸入N ( 1<=N<=100)、M(M>=0);第2行輸入N個整數,
之間用空格分隔。
輸出格式:在一行中輸出循環右移M位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。
輸入樣例:
6 2
1 2 3 4 5 6
輸出樣例:
5 6 1 2 3 4
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    if (m != n && m != 0) {
        if (m > n)
            m = m - n;
        reverse(a.begin(), a.begin() + n);
        reverse(a.begin(), a.begin() + m);
        reverse(a.begin() + m, a.begin() + n);
    }
    for (int j = 0; j < n -1; ++j) {
        cout << a[j] << " ";
    }
    cout << a[n - 1];

    return 0;
}

1009. 說反話 (20)-PAT乙級真題

題目描述:
給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。
輸入格式:測試輸入包含一個測試用例,在一行內給出總長度不超過80的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用1個空格分開,輸入保證句子末尾沒有多餘的空格。
輸出格式:每個測試用例的輸出佔一行,輸出倒序後的句子。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello
#include <iostream>
#include <stack>

using namespace std;

int main() {
    stack<string> v;
    string s;
    while(cin >> s) {
        v.push(s);
    }
    cout << v.top();
    v.pop();
    while (!v.empty()) {
        cout << " " << v.top();
        v.pop();
    }

    return 0;
}

1010. 一元多項式求導 (25)-PAT乙級真題

設計函數求一元多項式的導數。(注:xn(n爲整數)的一階導數爲n*xn-1。)
輸入格式:以指數遞降方式輸入多項式非零項係數和指數(絕對值均爲不超過1000的整數)。數字間以空格分隔。
輸出格式:以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。注意“零多項式”的指數和係數都是0,但是表示爲“0 0”。
輸入樣例:
3 4 -5 2 6 1 -2 0
輸出樣例:
12 3 -10 1 6 0
#include <iostream>

using namespace std;

int main() {
    int a, b;
    bool isFirst = false;
    while (cin >> a >> b) {
        if (b == 0)
            continue;
        if (isFirst)
            cout << " ";
        else
            isFirst = true;
        cout <<  a * b << " " << b - 1;
    }
    if (!isFirst)
        cout << "0 0";

    return 0;
}

1011. A+B和C (15)-PAT乙級真題

題目描述:
給定區間[-2^31, 2^31]內的3個整數A、B和C,請判斷A+B是否大於C。
輸入格式:
輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組佔一行,順序給出A、B和C。整數間以空格分隔。
輸出格式:
對每組測試用例,在一行中輸出“Case #X: true”如果A+B>C,否則輸出“Case #X: false”,其中X是測試用例的編號(從1開始)。
輸入樣例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
輸出樣例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false
#include <iostream>

using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        long long int a, b, c;
        cin >> a >> b >> c;
        cout << "Case #" << i + 1 << ": ";
        if (a + b > c)
            cout << "true";
        else
            cout << "false";
        cout << endl;
    }

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