一、题目描述
今天是 2012 年 4 月 12 日星期四,编写程序,输入今天开始到 12 月 31 日之间的任意日期,输出那一天是星期几。
题目地址3619. 日期 - AcWing题库https://www.acwing.com/problem/content/3622/输入格式
共两行,第一行包含一个整数 m,表示询问日期的月份。
第二行包含一个整数 d,表示询问日期的为该月的第几天。
输出格式
输出询问日期是星期几。
注意,要用英文表示。
周一到周日的英文表示如下:
"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"
数据范围
4≤m≤12,
1≤d≤31,
保证日期合法。
输入样例:
5
20
输出样例:
Sunday
二、题目思路
语言:C语言
思路:
- 定义一个数组,用来记录每个月第一日的下标,从4月份记起,表示距离4月1日有几天,如下:
int days[9] = {0,30,61,91,122,153,183,214,244};
解释:
a、从4月起,共有9个月所以数组长度为9。第一个元素表示4月1日记为第一天,下标为0;第二个元素表示5月1日距离 4月1日 有30天,下标为30。
b、这里为什么从4月1日记起?
因为题目中说要从4月12日开始,而且可以得知4月1日正好是周日,一周有7天,那么也就是说(距离 4月1日 的天数 % 7 ) 就是星期几(如果是0,则表示周日) 。
c、为什么只需要记录每个月的1号?
因为输入月份和日期,可以根据日期计算出当前日期距离 4月1日 有几天。 - 计算输入的日期距离 4月1日 有几天。
int res = (d + days[m-4] - 1) % 7;
解释:
d + days[m-4] - 1 表示 m月d日距离4月1日有几天。
例:5月20日,20 + days[5-4] -1 = 20 + 30 - 1 = 49 , 其中20-1 表示该天到5月1日有几天,30表示5月1日到4月1日有几天,加起来就是。再 % 7,也就是有几个整周,发现有7个(七七四十九),没有余数,所以也是周日。
三、代码实现
#include<bits/stdc++.h>
using namespace std;
int days[9] = {0,30,61,91,122,153,183,214,244};
char* ans[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int m,d;
int main(){
scanf("%d",&m);
scanf("%d",&d);
int res = (d + days[m-4] - 1) % 7;
printf("%s\n",ans[res]);
return 0;
}
四、运行结果
有任何问题欢迎指出!!!祝大家学习进步!