開啟章節選單
11219 How old are you?
題目連結
團隊發現在 CPE 官網題單中此題名稱為 Basic wall maze,與提供的題本不符,經研判可能為誤植,因此決議以題本資訊提供題解。
題目敘述
-
這裡是填好的表格。
-
謝謝。讓我看看……嗯……好、好、好……等等,你幾歲?
-
20歲。我是不是忘記填了?
-
沒有。這裡顯示你下個月才會出生!年份錯了……
-
哦……對不起!
這個流程將會變成自動化的,為了避免人為錯誤,會有一個自動計算欄位, 它會根據當前日期和所提供的出生日期來計算年齡。這就是你的任務:計算年齡, 或指出資料有問題。
輸入格式
入的第一行給出測試案例的數量 T(1 ≤ T ≤ 200)。接著有 T 組測試資料。 每組測試資料開始時有一個空行,接著是兩行資料,分別是:
-
當前日期
-
出生日期
日期格式為 DD/MM/YYYY,其中 DD 是日,MM 是月,YYYY 是年。所有日期都有效。
輸出格式
對於每組輸入資料,輸出一行如下格式的文字:
Case #N: AGE
其中 N 是目前測資的編號,AGE 為下列三種之一:
-
Invalid birth date:若計算出的年齡不可能(例如尚未出生)。
-
Check birth date:若計算出的年齡超過 130 歲。
-
年齡(只計算整數歲數):否則就輸出實際年齡。
-
若兩個日期完全相同,輸出年齡為 0。
解題思路
輸入
-
使用 getline() 讀取每行。
-
getline(cin, blank)跳過每組測資前的空白行。 -
使用
sscanf()將字串形式的日期拆成day,month,year。
檢查是否出生與合理性
- 如果出生日期晚於現在日期,則輸出
Invalid birth date。 - 如果 age > 130,輸出
Check birth date。
計算年齡
- 年齡設為
ny - by。 - 若尚未過生日,則
age--。
程式碼
#include <bits/stdc++.h> using namespace std; int main() { int t, nd, nm, ny, bd, bm, by; cin >> t; cin.ignore(); for (int i = 1; i <= t; i++) { string now, born, blank; getline(cin, blank); getline(cin, now); getline(cin, born); sscanf(now.c_str(), "%d/%d/%d", &nd, &nm, &ny); sscanf(born.c_str(), "%d/%d/%d", &bd, &bm, &by); int age = ny - by; if (nm < bm || (nm == bm && nd < bd)) { age--; } cout << "Case #" << i << ": "; if (ny < by || (ny == by && nm < bm) || (ny == by && nm == bm && nd < bd)) { cout << "Invalid birth date"; } else if (age > 130) { cout << "Check birth date"; } else { cout << age; } cout << "\n"; } return 0; }