题目描述:
1949年的国庆节 (10月1日) 是星期六。今年 (2012) 的国庆节是星期一。那么, 从建国到现在, 有几次国庆节正好是星期日呢?
思路解析:
1. 核心目标
统计从1950年到2012年之间,每年10月1日是星期天的次数。 通过累计每年的总天数并取模运算,判断日期周期性规律,最终输出符合条件的年份数量。
2. 关键逻辑分解
1). 闰年判断函数 `isleapYear`
规则:能被4整除且非整百年,或能被400整除的年份为闰年(如2000年是闰年,1900年不是)。
作用:为每年天数计算提供依据。
2). 主函数逻辑流程
初始化变量 ```cpp int count = 0; // 统计符合条件的年份数 int totalDays = 0; // 从1950年开始逐年累加的天数 ```
遍历年份范围 ```cpp for (int year = 1950; year <= 2012; year++) // 遍历63年(1950-2012) ```
计算每年天数并累加 ```cpp int daysInYear = isleapYear(year) ? 366 : 365; // 闰年366天,平年365天 totalDays += daysInYear; // 累计到总天数 ```
判断条件并计数 ```cpp if (totalDays % 7 == 1) { // 总天数模7余1时,当年10月1日为星期天count++; } ```
输出结果 ```cpp cout << count << endl; // 最终输出符合条件的年份数 ```
3. 数学原理与日期推算
模7的意义:一周7天,总天数模7的余数对应星期数的周期性变化。
关键推导:若累计到某年结束的总天数 `totalDays % 7 == 1`,说明当年的10月1日相对于初始参考点1949年10月1日 偏移了1天,即星期六 +1天 = 星期天。
4. 示例验证
以 1950年 和 1951年 为例:
1950年:平年(365天),`totalDays = 365`。- `365 % 7 = 1` → 1950年10月1日为星期日 → `count++`。
1951年:平年(365天),`totalDays = 365 + 365 = 730`。 - `730 % 7 = 2` → 不满足条件。
代码实现:
#include<iostream>
using namespace std;
bool isleapYear(int year){
return(year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
int main(){
int count = 0;
int totalDays = 0;
for(int year = 1950; year <= 2012; year++){
int prevYear = year;
int daysInYear = isleapYear(prevYear)?366:365;
totalDays += daysInYear;
if(totalDays % 7 == 1){
count++;
}
}
cout << count << endl;
return 0;
}