【題解】ZeroJudge d041: 11219 – How old are you?

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=d041
【解題想法】

  • 題目保證所有的日期都是有效的,且只要求計算出「實歲」,因此只要能分辨出兩個日期的相對距離即可。
    • 把一個月當成 31 天 (任一個月的天數都不會大於31)
    • 把一年當成 400 天 (31 * 12 = 372 < 400)
#include <iostream>
using namespace std;

int str2int(string &s, int start, int len){
    int ret = 0;
    for (int i = start; i < start+len; i++){
        ret *= 10;
        ret += s[i] - '0';
    }
    return ret;
}

int main() {
    int T;
    string s1, s2;
    cin >> T;
    for (int Case = 1; Case <= T; Case++){
        cin >> s1 >> s2;
        int dd1 = str2int(s1, 0, 2) + str2int(s1, 3, 2) * 31 + str2int(s1, 6, 4) * 400;
        int dd2 = str2int(s2, 0, 2) + str2int(s2, 3, 2) * 31 + str2int(s2, 6, 4) * 400;
        
        if (dd1 < dd2) cout << "Case #" << Case << ": Invalid birth date\n";
        else if ((dd1 - dd2) / 400 > 130) cout << "Case #" << Case << ": Check birth date\n";
        else cout << "Case #" << Case << ": " << (dd1 - dd2) / 400 << "\n";
    }
}

Python code (credit: Amy Chou)

T = int(input())
for TC in range(1, T+1):
    _ = input()
    s1 = input()
    s2 = input()
    s1 = [int(i) for i in s1.split('/')]
    s2 = [int(i) for i in s2.split('/')]
    dd1 = s1[0] + s1[1] * 31 + s1[2] * 400
    dd2 = s2[0] + s2[1] * 31 + s2[2] * 400
    if dd1 < dd2:
        print(f"Case #{TC}: Invalid birth date")
    elif (dd1 - dd2) // 400 > 130:
        print(f"Case #{TC}: Check birth date")
    else:
        print(f"Case #{TC}: {(dd1 - dd2) // 400}")
分享本文 Share with friends