# Date Calculation# Conditional Logic# String Manipulation

e680 - 11947 - Cancer or Scorpio

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據給定的最後一個月經週期的第一天 (MMDDYYYY),計算預產期 (加上40週),並判斷預產期對應的星座。需要考慮閏年。

解題思路

程式碼首先讀取測資數量 n。對於每組測資,從輸入字串中提取月、日、年。然後,計算預產期,考慮到妊娠期為40週,相當於增加280天。在計算預產期時,需要處理月份和年份的進位,並考慮閏年。最後,根據預產期的月和日,判斷對應的星座,並輸出結果。星座判斷的邏輯是根據題目提供的星座日期範圍。

複雜度分析

  • 時間複雜度: O(n),其中 n 是測資數量。對於每組測資,計算預產期和判斷星座的時間都是常數級別。
  • 空間複雜度: O(1),程式碼使用的額外空間是常數級別,例如儲存月份、日期、年份和星座名稱的陣列。

程式碼

#include <iostream>
using namespace std;
int  dm[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},bd[13] = {0, 21, 20, 21, 21, 22, 22, 23, 22, 24, 24, 23, 23},n;
string name[13] = {
	"capricorn", "aquarius", "pisces", "aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn"
};
int main(){
	string buf;
	cin >> n;
	for(int ca=1;ca<=n;++ca){ 
		cin >> buf;
		int month = (buf[0]-'0')*10+buf[1]-48,day = (buf[2]-'0')*10+buf[3]-48+280,year  = (buf[4]-'0')*1000+(buf[5]-'0')*100+(buf[6]-'0')*10+buf[7]-48;
		dm[2] = 28+(year%4 == 0 && year%100 || year%400 == 0);
		while (day > dm[month]) {
			day -= dm[month++];
			if (month > 12) {
				month = 1;
				++year ;
				dm[2] = 28 + (year%4 == 0 && year%100 || year%400 == 0);
			}
		}
		printf("%d %02d/%02d/%04d ",ca,month,day,year);
		(day < bd[month])? cout << name[month-1] << "\n":cout << name[month] << "\n";
	} 
}

Discussion