ZeroJudge A286: 難道這就是命中注定

題目敘述

本題採EOF方式收資料,每筆資料第一行有三個正整數代表主角的出生年、月、日。第二行會有一個正整數N,代表有幾個追求者正在追求主角。接下來會有N行,每行有三個正整數代表各個追求者的出生年、月、日。要求輸出哪個追求者的「特別數」和主角的「特別數」最為相近 (如果有相同特別數的情況則輸出較為前面的追求者),追求者的編號依序為1到N-1。

特別數計算方式:將出生年、月、日的各個位數的數字相加,並將得到的和執行一樣的動作,直到相加的和是個位數為止。

例:1990年9月28日出生,特別數就是2

1 + 9 + 9 + 0 + 9 + 2 + 8 = 38

3 + 8 = 11

1 + 1 = 2


範例輸入 #1

1990 9 28

1

1992 4 1


1991 10 15

2

1992 4 1

1992 3 2

範例輸出 #1

1

1


解題思路

使用字串來收出生的年、月、日。判斷相差值的時候可以使用小於這樣子就不會有相同相差值需要進行判斷的情況。

解題程式碼如下 (僅供參考):

#include <iostream>
using namespace std;

int calc (string a, string b, string c)
{
    string arr[3] = {a, b, c};
    int ans = 0;
    for (int i = 0; i<3; i++)
    {
        for (int j = 0; j<arr[i].length(); j++)
        {
            ans += int(arr[i][j] - '0');
        }
    }
    while (ans >= 10)
    {
        string str = to_string(ans);
        ans = 0;
        for (int i = 0; i<str.length(); i++)
        {
            ans += int(str[i] - '0');
        }
    }
    return ans;
}

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    cout.sync_with_stdio(0);
    cout.tie(0);
    string a, b, c;
    while (cin >> a >> b >> c)
    {
        int special = calc(a, b, c), N, difference = 999999, ans;
        cin >> N;
        for (int i = 1; i<=N; i++)
        {
            cin >> a >> b >> c;
            int count = calc(a, b, c), variance = abs(count - special);
            if (variance < difference)
            {
                difference = variance;
                ans = i;
            }
        }
        cout << ans << "\n";
    }
}

留言

這個網誌中的熱門文章

ZeroJudge M933: 邏輯電路

ZeroJudge A148: You Cannot Pass?!

ZeroJudge M932: 蜜蜂觀察