# Arithmetic# Modulo Operator# Conditional Statements

a003 - 兩光法師占卜術

🔗 前往 ZeroJudge 原題

題目描述

本題要求根據輸入的月份 M 和日期 D,使用一個簡單的公式來計算一個運勢值 S。公式為 S = (M*2 + D) % 3。根據 S 的值,輸出對應的運勢結果:當 S 為 0 時輸出「普通」,當 S 為 1 時輸出「吉」,當 S 為 2 時輸出「大吉」。程式需能處理多組輸入直到輸入結束。

解題思路

這是一道直接實作題,核心是將題目給定的公式準確地轉換為程式碼。

  1. 讀取輸入: 使用 while(cin >> M >> D) 循環,持續讀取月份 M 和日期 D,直到沒有更多輸入。
  2. 計算運勢值: 根據題目給定的公式 S = (M*2 + D) % 3 計算出 S 的值。
  3. 判斷並輸出: 使用條件判斷語句(例如 if-else if-else 或多個 if 語句),根據 S 的值來輸出相對應的運勢字串:「普通」、「吉」或「大吉」。由於 S 的值只可能為 0, 1, 2,因此直接對這三種情況進行判斷即可。

此方法直接、高效,完全符合題目要求。

複雜度分析

  • 時間複雜度: O(1) 對於每一組輸入的 MD,程式只執行固定次數的算術運算(乘法、加法、取模)和條件判斷,以及一次輸出操作。這些都是常數時間的操作,因此處理每組輸入的時間複雜度為 O(1)。若考慮整個程式執行過程處理 N 組輸入,則總時間複雜度為 O(N)。
  • 空間複雜度: O(1) 程式僅使用了固定數量的變數來儲存輸入值 MD 和中間計算結果,不論輸入資料量多大,所需的記憶體空間都保持不變。

程式碼

#include <iostream>

using namespace std;

int main (){
	
	int M;
	int D;
	
	while(cin >> M >> D){
		if((M*2+D)%3==0){
			cout << "普通" << endl;
		}
		if((M*2+D)%3==1){
			cout << "吉" << endl;
		}
		if((M*2+D)%3==2){
			cout << "大吉" << endl;
		}
	}
}

Discussion