輸入日期 yyyy/mm/dd(多組,EOF 結束),輸出該日期是當年的第幾天。
#include
int main(void) {
int y, m, d;
// 每月天數表(非閏年)
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
while (scanf("%d/%d/%d", &y, &m, &d) == 3) {
int sum = 0;
// 累加前 m-1 月天數
for (int i = 0; i < m - 1; i++) {
sum += days[i];
}
// 閏年且月份 > 2,加 1 天
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
if (m > 2) sum++;
}
printf("%d\n", sum + d);
}
return 0;
}
(年份 % 4 == 0 && 年份 % 100 != 0) || 年份 % 400 == 0。m > 2 時才補一天。scanf("%d/%d/%d") 直接匹配斜槓分隔符,簡潔健壯。days[i] 對應第 i+1 月,循環 i < m-1 累加前 m-1 月。| 輸入 | 輸出 | 說明 |
|---|---|---|
| 2000/01/01 | 1 | 閏年首日 |
| 2000/02/29 | 60 | 閏日 |
| 2000/03/01 | 61 | 閏年3月1日 |
| 2001/03/01 | 60 | 平年3月1日 |
| 2000/12/31 | 366 | 閏年尾日 |
| 2001/12/31 | 365 | 平年尾日 |
m > 2 判斷,導致 1-2 月也加一天。scanf 失敗死循環(建議檢查返回值 == 3)。