題目:計算 1901 年 1 月 1 日至 2000 年 12 月 31 日期間,有多少個月的第一天是星期天?已知 1900.1.1 是星期一,並給出月份天數與閏年規則。
#include <stdio.h>
#include <stdbool.h>
bool isLeapYear(int year);
int getYearNum(int *start, int year);
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int leapdays[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main(void) {
int sum = 0, startWeek = 1, startYear = 1900;
for (int i = 1; i < 13; ++i) { days[i] += days[i-1]; leapdays[i] += leapdays[i-1]; }
for (int i = startYear; i < 1901; ++i) getYearNum(&startWeek, i);
for (int i = 1901; i <= 2000; ++i) sum += getYearNum(&startWeek, i);
printf("%d\n", sum);
return 0;
}
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int getYearNum(int *start, int year) {
int count = 0, yeardays = isLeapYear(year) ? 366 : 365;
int *mdays = isLeapYear(year) ? leapdays : days;
for (int i = 0; i < 12; ++i)
if ((mdays[i] % 7 + *start) % 7 == 0) ++count;
*start = (yeardays % 7 + *start) % 7;
return count;
}
核心思路:預計算每月累積天數,利用模 7 運算追蹤每月 1 號的星期,避免日期庫依賴。
import calendar
sum = 0
for year in range(1901, 2001):
for month in range(1, 13):
if calendar.monthcalendar(year, month)[0].index(1) == 6:
sum += 1
print(sum)
calendar.monthcalendar 返回矩陣,首行首個 1 代表該月 1 號,索引 6 即星期天。代碼極其簡潔,體現 Python「電池內含」哲學。
let sum = 0;
for (let year = 1901; year <= 2000; year++) {
for (let month = 1; month <= 12; month++) {
if (new Date(year, month - 1, 1).getDay() === 0) sum++;
}
}
console.log(sum);
利用 Date 物件原生支持,可直接在瀏覽器或 Node.js 運行,適合快速驗證與前端展示。
同一問題,C 語言展示底層邏輯控制,Python 體現標準庫威力,JavaScript 則提供即時互動性。多語言實踐有助於拓寬解決問題的視角。