輸入年月日,輸出:星期幾(0-6 代表周日-周六)、該日期是年間第幾天、是否閏年。支援輸入驗證。
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
從 0001-01-01 起算總天數,模 7 得星期:
int dayCount(int y, int m, int d) {
// 前 y-1 年總天數 + 當年前 m-1 月天數 + 當月天數
int days = (y - 1) * 365 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400;
static const int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
for (int i = 0; i < m - 1; ++i) days += monthDays[i];
if (m > 2 && isLeapYear(y)) ++days; // 閏年2月後加1
return days + d;
}
int weekDay(int y, int m, int d) {
return dayCount(y, m, d) % 7; // 0=Sun, 1=Mon, ..., 6=Sat
}
int dayOfYear(int y, int m, int d) {
static const int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int days = d;
for (int i = 0; i < m - 1; ++i) days += monthDays[i];
if (m > 2 && isLeapYear(y)) ++days;
return days;
}
#include#include using namespace std; class Date { int y, m, d; public: Date(int year, int month, int day) : y(year), m(month), d(day) { if (!valid()) throw invalid_argument("Invalid date"); } bool valid() const { if (y <= 0 || m < 1 || m > 12 || d < 1) return false; static const int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int dim = md[m-1]; if (m == 2 && isLeapYear(y)) dim = 29; return d <= dim; } static bool isLeapYear(int y) { return (y%4==0 && y%100!=0) || (y%400==0); } int dayOfYear() const { static const int md[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int days = d; for (int i = 0; i < m-1; ++i) days += md[i]; if (m > 2 && isLeapYear(y)) ++days; return days; } int totalDays() const { // 從 0001-01-01 起算 int days = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400; days += dayOfYear(); return days; } int weekDay() const { return totalDays() % 7; } // 0=Sun void print() const { const char* wd[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; cout << y << '-' << m << '-' << d << " is " << wd[weekDay()] << ", day " << dayOfYear() << " of year" << (isLeapYear(y) ? " (leap)" : " (common)") << '\n'; } }; int main() { int y, m, d; while (cin >> y >> m >> d) { try { Date dt(y, m, d); dt.print(); } catch (exception& e) { cout << "Invalid date\n"; } } }
輸入:2024 2 29 輸出:2024-2-29 is Thursday, day 60 of year (leap) 輸入:2023 12 31 輸出:2023-12-31 is Sunday, day 365 of year (common)
operator- 計算兩日期天數差std::chrono (C++20) 替代手動實現