题目
输入年、月、第几周、周几,输出对应的 年、月、日。
参考资料
1.https://blog.csdn.net/qq_42403069/article/details/86305578
2.https://blog.csdn.net/u011017652/article/details/17229781
注意
如果有错,欢迎指正!
一、每一周定义有两种:
1.周日到周六
2.周一到周日
这两种不同的定义可能会导致不同的计算结果。这里的代码放入的是第一种定义的结果,若想改为第二种,需要调整代码中的b[ ]和后续代码。下面所述全部以第一种定义为基础。
二、“第几周”的定义
- 每周的第一周和最后一周一般不完整,如上图(以周日-周六为一周为例):2018年2月的第一周从周四开始,第一周没有周日、周一、周二、周三;最后一周没有周四、周五、周六。
- 每个月份的周数有一定范围,不存在“第0周”、“第7周”、“第8周”的说法。
思路
主要是在搜索相关问题时,发现基姆拉尔森计算公式的存在,利用该公式求出每月1号的星期数。根据求得的星期可以判断输入是否正确,例如:输入2019 07 1 7(2019年7月第1周周日),是错误输入,因为该月第一周没有周日。
以输入2019 07 3 2为例,首先计算2019年7月1日是星期一,计算第一周天数,计算第二周天数,计算第三周天数,累加之后判断是否超过该月最大的天数,超过就返回0,未超过就计算出了号数。
c++代码
周日到周六为一周:
#include<iostream>
#include<iomanip>
using namespace std;
//基姆拉尔森计算公式计算某年某月某日对应的星期
int CaculateWeekDay(int yy, int mm, int d)
{
if (mm == 1 || mm == 2) {
mm += 12;
yy--;
}
int iWeek = (d + 2 * mm + 3 * (mm + 1) / 5 + yy + yy / 4 - yy / 100 + yy / 400) % 7;
return iWeek + 1;
}
int a[][12] = {
{
31,28,31,30,31,30,31,31,30,31,30,31 },
{
31,29,31,30,31,30,31,31,30,31,30,31 } };
int b[8] = {
0,1,