【每日一题】一周中的第几天(基姆拉尔森公式的应用)

【每日一题】一周中的第几天(基姆拉尔森公式的应用)

  相关文章:

  【每日一题】一周中的第几天(基姆拉尔森公式的应用)

  【每日一题】美国节日(基姆拉尔森公式、蔡勒公式)

  【每日一题】计算日期到天数的转换



1、题目来源

  Leetcode:一周中的第几天


2、题目描述

  给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。输入为三个整数:day、month 和 year,分别表示日、月、年。
  您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}

  提示: 给出的日期一定在1971到2100年之间的有效日期。


3、示例

  示例1:

输入:day = 31, month = 8, year = 2019
输出:“Saturday”

  示例2:

输入:day = 18, month = 7, year = 1999
输出:“Sunday”

  示例3:

输入:day = 15, month = 8, year = 1993
输出:“Sunday”


4、解题思路

  对于问题一常用的两个公式是基姆拉尔森公式和蔡勒公式,都是计算星期数的。

  ● 基姆拉尔森公式: w e a k = ( d a y + 2 × m o n t h + 3 × ( m o n t h + 1 ) 5 + y e a r + y e a r 4 − y e a r 100 + y e a r 100 + 1 ) m o d 7 weak=(day + 2\times month + \frac{3\times(month+1)}{5} + year + \frac{year}{4} - \frac{year}{100} + \frac{year}{100} +1) mod 7 weak=(day+2×month+53×(month+1)+year+4year100year+100year+1)mod7

  ● 蔡勒公式: w e a k = ( y e a r + [ y e a r 4 ] + [ c 4 ] − 2 c + [ 13 × ( m o n t h + 1 ) 5 ] + d a y − 1 ) m o d 7 weak=(year + [\frac{year}{4}] + [\frac{c}{4}] -2c + [\frac{13\times(month+1)}{5}] + day -1) mod 7 weak=(year+[4year]+[4c]2c+[513×(month+1)]+day1)mod7
其中:

  其中: year, month, day, weak分别表示年(后两位)、月、日、星期,c 表示为世纪数减一,即year/100(前两位)

  注意:

  • 星期是从星期天开始计的(0-Sunday;1-Monday;2-Tuesday;3-Wednesday;4-Thursday;5-Friday;6-Saturday)
  • 1月和2月要转成上一年的13月和14月:比如2020.01要转成2019.13

5、代码展示

  (1)基姆拉尔森公式

string dayOfTheWeek(int day, int month, int year) 
{
        if (month==1||month==2)
        {
            month+=12;
            year--;
        }
        int week = (day + 2*month + 3 * (month+1)/5 + year + year/4 - year/100 + year/400 + 1) % 7;//基姆拉尔森公式
        string str[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        return str[week];
    }

  (2)蔡勒公式

 string dayOfTheWeek(int day, int month, int year) 
    {
    	if(month == 1 || month == 2) 
    	{
       	 	month += 12;
        	year--;
   	 	}
    
  		int c = year / 100;
    	int y = year % 100;
    	int m = month;
    	int d = day;
    	int W = c/4-2*c+y+y/4+26*(m+1)/10+d-1;//蔡勒公式 

		while(W<0) { W+=7;}
        W=W%7;

    	string str[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    	return str[W];
    }
};

6、补充说明

  最后关于蔡勒公式,还需要做两点补充说明:

  (1) 在计算机编程中,W的计算结果有可能是负数。我们需要注意,数学中的求余运算和编程中的求余运算不是完全相同的,数学上余数不能是负数,而编程中余数可以是负数。
  因此,在计算机中 W 是负数时,我们需要进行修正。修正方法十分简单:让 W 加上一个足够大的 7 的整数倍,使其成为正数,得到的结果再对 7 取余即可。比如 − 15 -15 15,我可以让其加上 7 × 10 7\times10 7×10 − 15 + 70 = 55 -15+70=55 15+70=55,再除以 7 余 6,通过余数可知这一天是星期六。

  (2) 蔡勒公式只适用于格里高利历(也就是现在的公历)。有关历法的问题,大家有兴趣可以深刻研究。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值