题目描述:
已知2022年10月11日是星期二
现在给定你一个日期,你需要计算当天是星期几。
输入格式:
一行三个整数M,D,Y,表示所求日期为:M月D日,Y年
1600≤Y≤2400,保证输入日期均为合法日期。
输出格式:
输出一个数字,表示当前是星期几。
如果星期天,则输出0。
输入样例1:
8 17 1926
输出样例1:
2
输入样例2:
2 29 1904
输出样例2:
1
解题思路:
采用IPO思路实现功能: (1)I:
输入月、日、年
(2)P:
核心解题思路:累计从“第一天”开始,一共有多少天D_sum,%7
计算出“第一天”是星期一(手动)
首先用一个整型数组存储所有的月份对应的天数,实现一个闰年判断功能的函数;
然后遍历每一年,求出其中闰年的年数,即额外多出的天数;
累加(Y - 1) * 365 + D + 额外多出的天数;
遍历每一个月累加;
如果是闰年,需要进行额外判断当前是否过了2月29日,若没有,需要D_sum -= 1
(3)O:
最后用switch分支输出即可;
实现代码如下:
#include <iostream> using namespace std; int month_array[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//记录非闰年的每个月有多少天 bool is_year(int year)//实现判断是否为闰年功能的函数 { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return true; } else { return false; } } int main() { int M, D, Y; cin >> M >> D >> Y;//输入月、日、年 int sum = 0;//累计共有多少闰年,即为需要额外增加的天数 for (int i = 1; i <= Y; i++) { sum += is_year(i); } //累计共有多少天D_sum long long D_sum = (long long)(D)+(long long)(Y - 1) * 365l + (long long)(sum);//注意:第Y年并没有过去,故Y - 1 for (int i = 1; i < M; i++)//注意:第M月并没有过去,不累加进入和 { D_sum += month_array[i]; } if (is_year(Y))//如果是闰年,需要额外判断 { if (M < 2 || M == 2 && D <= 29)//当前二月没有过去或者二月没有过到第二十九天的话 { D_sum -= 1;//闰年和非闰年无差别 } } switch (D_sum % 7)//输出结果 { case 0: cout << 0 << endl; break; case 1: cout << 1 << endl; break; case 2: cout << 2 << endl; break; case 3: cout << 3 << endl; break; case 4: cout << 4 << endl; break; case 5: cout << 5 << endl; break; case 6: cout << 6 << endl; break; default: break; } return 0; }