计算星期几的C++实现主要有以下两种方法:蔡勒公式和迭代法。以下是具体实现方案:
一、蔡勒公式(Zeller's Congruence)
蔡勒公式适用于公历日期计算,公式如下: $$ W = \left[ y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + d - 1 \right] \mod 7 $$
其中:
-
$W$:星期(0=星期日,1=星期一,...,6=星期六)
-
$y$:年份(后两位)
-
$m$:月份(1-12,1月和2月按上一年的13月和14月计算)
-
$d$:日期
示例代码 :
#include <iostream>
#include <vector>
#include <cmath>
std::string getWeekday(int y, int m, int d) {
if (m == 1 || m == 2) {
y--;
m += 12;
}
int w = (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
std::vector<std::string> weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
return weekdays[w];
}
int main() {
int year, month, day;
std::cin >> year >> month >> day;
std::cout << getWeekday(year, month, day) << std::endl;
return 0;
}
二、迭代法(逐月累加天数)
通过迭代计算从公元1年1月1日到目标日期的总天数,再取模7确定星期。此方法无需处理闰年等复杂情况,但效率较低。
示例代码 :
#include <iostream>
#include <vector>
std::string getWeekday(int y, int m, int d) {
std::vector<int> daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) daysInMonth = 29; // 闰年处理
int c = y / 100, y_mod = y % 100;
int w = 0;
for (int i = 0; i < m - 1; ++i) {
w += daysInMonth[i];
if (i == 1 || i == 3) w += 1; // 1月、3月后移一天
}
w += d;
w -= 2*c + c/4 - y_mod/4 + y_mod/100 - y_mod/400;
w %= 7;
std::vector<std::string> weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
return weekdays[w];
}
int main() {
int year, month, day;
std::cin >> year >> month >> day;
std::cout << getWeekday(year, month, day) << std::endl;
return 0;
}
选择建议
-
蔡勒公式 :计算效率高,适用于大多数场景,但需注意月份和年份的转换规则。
-
迭代法 :代码简单直观,但效率较低,适合教学或简单应用。
以上代码均基于标准C++编写,可根据需求选择合适的方法。