ZeroJudge E535: The Huge One

同題:UVa 11344 – The Huge One

老師出了一個程式作業給你的女友 Marry。(你沒有女友)
由於您你在寫程式方面是大神,因此你非常樂意幫助她。(工具人)
因為你計劃本週末和她一起去看電影,所以你不希望你的女友花太多時間在寫程式上。
如果你完成這項作業,Marry 會非常開心,並且可能在周末不只跟你看電影。(>/////<)
以下為 Marry 的作業:
給定數字 M (0 ≤ M ≤ 10^1000),並且從間隔 [1 ~ 12] 之間挑選不同數字組成集合 S。此集合 S 中的所有數字均為整數。
如果數字 M 可被集合 S 中的所有數字整除,則稱其為「Wonderful」。請判斷數字 M 是否「Wonderful」。

範例測資

範例輸入範例輸出
輸入第一行包含數字 N (0 < N ≤ 2000),代表有幾組測資。
每組測資的第一行包含數字 M (0 ≤ M ≤ 10^1000)。
第二行包含集合 S 中的元素數量,以及集合中的數字。
第二行的數字皆由空格分隔。集合 S 元素皆在 [1 ~ 12] 的範圍內。
對於每組測資輸出一行:
如果數字 M 可被集合 S 中的所有數字整除
輸出「M – Wonderful.」
否則輸出「M – Simple.」。
M 請用相應的測資數字替換。
4
0
12 1 2 3 4 5 6 7 8 9 10 11 12
379749833583241
1 11
3909821048582988049
1 7
10
3 1 2 9
0 – Wonderful.
379749833583241 – Wonderful.
3909821048582988049 – Wonderful.
10 – Simple.

解題思路

使用字串收 M,以下是如何判斷數字是否能被整除:

  • 2: 個位數字是否是偶數
  • 3: 所有位數的數字總和是否能被 3 整除
  • 4: 最後兩位數是否能被 4 整除
  • 5: 個位數字是否是 0 或 5
  • 6: 能被 2 和 3 整除
  • 7: 將數字分成三個數字一組 (從右到左),輪流加減之後是否能被 7 整除
  • 8: 最後三位數是否能被 8 整除
  • 9: 所有位數的數字總和是否能被 9 整除
  • 10: 個位數字是否為 0
  • 11: 奇數位數的數字總和減偶數位數的數字總和是否能被 11 整除
  • 12: 是否能被 3 和 4 整除

範例程式碼-ZeroJudge E535: The Huge One

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    cin >> N;
    for (int i = 0; i<N; i++) {
        string M;
        cin >> M;
        int S;
        cin >> S;
        bool ans = true;
        for (int j = 0; j<S; j++) {
            int num;
            cin >> num;
            if (num == 2) {
                const int tmp = M[M.length()-1] - '0';
                if (tmp % 2 != 0) ans = false;
            }
            else if (num == 3) {
                int sum = 0;
                for (int k = 0; k<M.length(); k++) {
                    sum += M[k] - '0';
                }
                if (sum % 3 != 0) ans = false;
            }
            else if (num == 4) {
                if (M.length() >= 2) {
                    const int tmp = stoi(M.substr(M.length()-2, M.length()));
                    if (tmp % 4 != 0) ans = false;
                }
                else {
                    if (stoi(M) % 4 != 0) ans = false;
                }
            }
            else if (num == 5) {
                const char ch = M[M.length()-1];
                if (ch != '0' && ch != '5') ans = false;
            }
            else if (num == 6) {
                const int tmp = M[M.length()-1] - '0';
                if (tmp % 2 != 0) ans = false;
                int sum = 0;
                for (int k = 0; k<M.length(); k++) {
                    sum += M[k] - '0';
                }
                if (sum % 3 != 0) ans = false;
            }
            else if (num == 7) {
                int count = 0;
                string tmp = "";
                vector<int>v;
                for (int k = M.length()-1; k>=0; k--) {
                    tmp += M[k];
                    count++;
                    if (count == 3) {
                        reverse(tmp.begin(), tmp.end());
                        v.push_back(stoi(tmp));
                        tmp = "";
                        count = 0;
                    }
                }
                if (tmp.length() > 0) {
                    reverse(tmp.begin(), tmp.end());
                    v.push_back(stoi(tmp));
                }
                int sum = 0;
                for (int i = 0; i<v.size(); i++) {
                    if (i % 2 == 0) {
                        sum += v[i];
                    }
                    else sum -= v[i];
                }
                if (sum % 7 != 0) ans = false;
            }
            else if (num == 8) {
                if (M.length() >= 3) {
                    const int tmp = stoi(M.substr(M.length()-3, M.length()));
                    if (tmp % 8 != 0) ans = false;
                }
                else {
                    if (stoi(M) % 8 != 0) ans = false;
                }
            }
            else if (num == 9) {
                int sum = 0;
                for (int k = 0; k<M.length(); k++) {
                    sum += M[k] - '0';
                }
                if (sum % 9 != 0) {
                    ans = false;
                }
            }
            else if (num == 10) {
                if (M[M.length()-1] != '0') ans = false;
            }
            else if (num == 11) {
                int odd = 0, even = 0;
                for (int k = 0; k<M.length(); k++) {
                    if (k % 2 != 0) even += M[k] - '0';
                    else odd += M[k] - '0';
                }
                if ((even - odd) % 11 != 0) ans = false;
            }
            else if (num == 12) {
                int sum = 0;
                for (int k = 0; k<M.length(); k++) {
                    sum += M[k] - '0';
                }
                if (sum % 3 != 0) ans = false;
                if (M.length() >= 2) {
                    const int tmp = stoi(M.substr(M.length()-2, M.length()));
                    if (tmp % 4 != 0) ans = false;
                }
                else {
                    if (stoi(M) % 4 != 0) ans = false;
                }
            }
        }
        if (M == "0") {
            cout << "0 - Wonderful.\n";
            continue;
        }
        if (ans) cout << M << " - Wonderful.\n";
        else cout << M << " - Simple.\n";
    }
}

//ZeroJudge E535
//Dr. SeanXD

發佈留言