题目是这样的:
已知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
看完,做何感想?对于初学者来说,是比较麻烦的。但是要克服畏难心理,这是一个程序员所必须具有的能力。
当然,各位肯定可以注意到,要注意平年闰年的问题。
我们可以写两个数组,分别用于存储平年的每个月各自的天数与闰年每个月各自的天数
int ping[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int ren[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
这样方便天数的累加
之后,我们把给到我们的数据分成3类来处理
1、在这个日期之前
2、在这个日期之后
#include <iostream>
#include <cmath>
using namespace std;
bool judge(int n)
{
if ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0))
{
return 1;
}
return 0;
}
int main()
{
int days = 0;
int month, day, year;
cin >> month >> day >> year;
int ping[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int ren[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
if (year >= 2022)
{
for (int i = 2022; i < year; i += 1) // 这样的话,多加了2022/10/11之前的天数,少加了所给日期的月与天
{
if (judge(i))
{
days += 366;
}
else
{
days += 365;
}
}
// 先减去之前的天数:
for (int i = 1; i < 10; i += 1)
{
days -= ping[i - 1];
}
days -= 11;
// 再加上所给日期的天数与月数
// 注意所给年的平年润年
if (judge(year))
{
for (int i = 1; i < month; i += 1)
{
days += ren[i - 1];
}
days += day;
}
else
{
for (int i = 1; i < month; i += 1)
{
days += ping[i - 1];
}
days += day;
}
// 这样就这样了
}
else
{
for (int i = year; i < month; i += 1) // 这样就多加了所给的月数与日数。这样就少加了10/11
{
if (judge(i))
{
days += 366;
}
else
{
days += 365;
}
}
// 之后再减去所给的日与月
if (judge(year))
{
for (int i = 1; i < month; i += 1)
{
days -= ren[i - 1];
}
days -= day;
}
else
{
for (int i = 1; i < month; i += 1)
{
days -= ping[i - 1];
}
days -= day;
}
// 之后再加上10/11;
for (int i = 1; i < 10; i += 1)
{
days += ping[i - 1];
}
days += day;
}
// 这时候,就开始算了
int x;
x = days % 7;
int real;
if (2022 * 100 + 10 * 10 + 11 > year * 100 + month * 10 + day)
{
real = x + 2;
}
else
{
real == 9 - x;
}
cout << real;
return 0;
}