d047 - 10070 - Leap Year or Not Leap Year and ...
題目描述
題目要求判斷給定的年份是否為閏年、Huluculu 節慶年、Bulukulu 節慶年,並按照特定順序輸出對應的訊息。如果年份既不是閏年也不是節慶年,則輸出 "This is an ordinary year."。輸入以 EOF 結束,且年份大於等於 2000。
解題思路
程式碼逐個字元讀取輸入。如果讀取到數字字元,則將其轉換為整數並累積到 b 變數中,並對 330000 取模。如果讀取到非數字字元,則根據 b 的值判斷年份的特性。首先檢查是否為閏年,然後檢查是否為 Huluculu 節慶年,最後檢查是否為 Bulukulu 節慶年。根據判斷結果,按照閏年 -> Huluculu -> Bulukulu 的順序輸出訊息。如果沒有任何特性,則輸出 "This is an ordinary year."。每次處理完一個年份後,輸出一個空行。
複雜度分析
- 時間複雜度: O(N),其中 N 是輸入字串的長度。因為程式碼需要讀取並處理每個輸入字元。
- 空間複雜度: O(1),程式碼只使用了幾個整數變數和字元變數,空間使用不隨輸入大小變化。
程式碼
#include <stdio.h>
int main(){
char a;
int b=0;
while(a=getchar()){
if(a==-1)break;
if(a>='0'){
b*=10;
b+=a-'0';
b%=330000;
}
else{
char c=0;
char d=0;
if((b%4==0&&b%100!=0)||b%400==0){
printf("This is leap year.\n");
c=1;
d=1;
}
if(b%15==0){
printf("This is huluculu festival year.\n");
c=1;
}
if(b%55==0&&d==1){
printf("This is bulukulu festival year.\n");
c=1;
}
if(c==0)
printf("This is an ordinary year.\n");
b=0;
printf("\n");
}
}
}