開啟章節選單

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;
}