首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

跨語言實戰:C、Python、JavaScript 解決 Project Euler 第 19 題

     編輯:關於C語言

跨語言實戰:C、Python、JavaScript 解決 Project Euler 第 19 題

題目:計算 1901 年 1 月 1 日至 2000 年 12 月 31 日期間,有多少個月的第一天是星期天?已知 1900.1.1 是星期一,並給出月份天數與閏年規則。

C 語言版:手動推算星期偏移

#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 號的星期,避免日期庫依賴。

Python 版:標準庫一行解決

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「電池內含」哲學。

JavaScript 版:可視化與跨平台

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 則提供即時互動性。多語言實踐有助於拓寬解決問題的視角。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved