# Math# Conditional Logic

a004 - 文文的求婚

🔗 前往 ZeroJudge 原題

題目描述

本題要求判斷給定年份是否為閏年。根據題目提供的規則,一個年份如果是閏年,需滿足以下兩個條件之一:

  1. 西元年份能被 400 整除。
  2. 西元年份能被 4 整除,但不能被 100 整除。

輸入包含若干行,每行一個整數代表年份,直到檔案結束 (EOF)。對於每個輸入年份,輸出「閏年」或「平年」。

解題思路

根據題目給定的閏年判斷規則,我們可以將其翻譯成 C++ 的條件判斷語句。核心邏輯是判斷一個年份 Y 是否符合以下布林表達式: (Y % 400 == 0) 或者 (Y % 4 == 0 && Y % 100 != 0)

如果這個表達式為真,則為閏年;否則為平年。

觀察提供的 AC 程式碼,它採用了兩組 if 語句的組合:

  1. if(Y%400==0):首先判斷年份是否能被 400 整除。如果符合,則直接輸出「閏年」。
  2. if(Y%4==0&&Y%100!=0):接著判斷年份是否能被 4 整除但不能被 100 整除。如果符合,也輸出「閏年」。
  3. else:這個 else 語句只與第二個 if 語句綁定。它會在第二個 if 的條件不成立時執行,並輸出「平年」。

這種寫法巧妙地利用了閏年規則的優先級:

  • 如果一個年份能被 400 整除 (例如 2000 年),則第一個 if 會執行並輸出「閏年」。由於能被 400 整除的年份也一定能被 100 整除,因此第二個 if 的條件 Y%100!=0 會是 false,導致整個第二個 if 語句塊不會執行,其後面的 else 也不會被觸發,避免了重複輸出或錯誤判斷。
  • 如果一個年份不能被 400 整除 (例如 1900 年、2004 年、2003 年),則第一個 if 語句不會執行。此時,判斷就完全落在第二個 if-else 語句組上:
    • 如果它能被 4 整除但不能被 100 整除 (例如 2004 年),則第二個 if 會執行並輸出「閏年」。
    • 如果它不滿足上述條件 (例如 1900 年不能被 400 整除,但能被 100 整除;2003 年不能被 4 整除),則第二個 if 的條件不成立,其綁定的 else 會執行並輸出「平年」。

這種分開的 if 結構在邏輯上等同於一個複合的 if-else if-else 鏈條,正確地實現了閏年的判斷邏輯。

複雜度分析

  • 時間複雜度: 對於每個輸入年份,程式碼只執行常數次的模運算 (%) 和比較運算。因此,每個測試案例的時間複雜度為 O(1)。如果總共有 N 個年份需要判斷,則總時間複雜度為 O(N)
  • 空間複雜度: 程式碼僅使用一個整數變數 Y 來儲存當前年份,以及標準輸入輸出的緩衝區。所需的記憶體空間是固定的,不隨輸入年份的數量或大小而變化。因此,空間複雜度為 O(1)

程式碼

#include <iostream>

using namespace std;

int main (){
	
	int Y;
	while (cin >> Y){
		if(Y%400==0){
			cout << "閏年" <<endl;
		}
		if(Y%4==0&&Y%100!=0){
			cout << "閏年" <<endl;
		}
		else{
			cout << "平年" <<endl; 
		}
	}
}

Discussion