LeetCode 1185.一周中的第几天【c++】

G.X.Y~苏 G.X.Y~苏 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

一、题目

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:day、month 和 year,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。

示例1:

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

示例2:

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

示例3:

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

提示:

 

  • 给出的日期一定是在 1971 到 2100 年之间的有效日期。

二、方法一:

这个日期是在1971年往后的,因此,我们可以先算出1971年至今一共有多少天。计算过程中要注意闰年问题,同时也要注意1971年1月1日是周五。

class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
        string week[7]={"Friday","Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday"};    1971年第一天为周五,因此这样排列更方便
        int Mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

        int count=0;
        for(int i=year-1;i>1971;i--){
            if((i%4==0 && i%100!=0) || i%400==0)
            count++;
        }
        int yearNum=365*(year-1971)+count;      //1971年到上一年的总天数
        
        int monthNum=0;
        for(int i=0;i<month-1;i++){
            if((year%4==0 && year%100!=0) || year%400==0){
                Mon[1]=29;
            }
            else{
                Mon[1]=28;
            }
            monthNum+=Mon[i];       //这一年,到上个月的总天数
        }
        
        int sum=yearNum+monthNum+day-1;
        int n=sum%7;
        return week[n];       

    }
};

 

三、方法二:

蔡勒公式:

(来自百度百科搜索)

蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。

1,2月要当成上一年的13,14月计算。

公式:

 

w:星期;0--周日;1--周一……

c:世纪

y:年

m:月;1.在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算(eg.2020.1.3要看做2019.13.3);2. 3<=m<=14

d:日

[]:表示取整,只要整数部分。

class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
        string week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
        if(month<3){
            month+=12;
            year-=1;
        }
        int c=year/100;    //世纪
        year%=100;     //年
        int w=c/4-2*c+year+year/4+13*(month+1)/5+day-1+210;//减的内容最大为199,为防止w为负数,则可加上一个大于199且为7的倍数的数字,如:210
        return week[w%7];  
    }
};

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/day-of-the-week

...全文

相关推荐

评论 1
收藏 已收藏
分享
返回顶部