e680 - 11947 - Cancer or Scorpio
題目描述
題目要求根據給定的最後一個月經週期的第一天 (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";
}
}