给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数: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 年之间的有效日期。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/day-of-the-week
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本来是想用今天的日期和星期来作为标准通过计算获取任意天的星期的,结果发现越弄越复杂,先把这种方式没完成的代码存在这
char * dayOfTheWeek(int day, int month, int year){
char *wday[]=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
int wmonth[]=[31,28,31,30,31,30,31,31,30,31,30,31];
int diffd=0,diffm=0,diffy=0,i=0;
if(year < 2021)
{
diffy = 2021-year-1;
diffd = 61+diffy/4+365*diffy;
if(month == 1)
diffd = diffd+(365-day);
else
{
for(i=month-1;i<month;i++)
diffd = diffd+wmonth[i];
}
}
}
第二次想的方法是直接以1971年1月1日星期五作为基准,这样就可以大幅度减少判断流程和计算量
/*int isrun(int year){
if((year%100 != 0 && year%4 == 0) || (year%100 == 0 && year%400 == 0))
return 1;
else
return 0;
}*/
char * dayOfTheWeek(int day, int month, int year){
char *wday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int wmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
int diffd=0,diffm=0,diffy=0,i=0;
diffy = year-1971;
diffm = month-1;
diffd = day-1;
if(month > 2 && ((year%100 != 0 && year%4 == 0) || (year%100 == 0 && year%400 == 0))) //可替代为isrun函数判断是否为闰年
diffd = diffd+(year-1969)/4+diffy*365+1;
else
diffd = diffd+(year-1969)/4+diffy*365;
if(month > 1)
{
for(i=0;i<diffm;i++)
diffd = diffd+wmonth[i];
}
return wday[(5+diffd%7)%7];
}
还可以用基姆拉尔森公式(Kim larsen calculation formula)
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
char * dayOfTheWeek(int day, int month, int year){
char *wday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int w=0;
if(month == 1 || month == 2)
{
month = month+12;
year = year-1;
}
w = (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
return wday[w];
}
另外:C语言中定义字符串数组时有两种方法:
方法1:定义一个char类型的二维数组
这种方法是通过定义一个char类型的二维数组实现,通过二维数组的行索引可得到数组中的每个字符串,列的大小限定了每个字符串所能包含的最大字符个数,所以采用这种定义方式时,列的大小必须不能小于数组所有字符串的最大长度。如对于上面的数组,C语言的定义代码如下:
char wday[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
在取该数组的每个字符串时,直接对行索引即可。
方法2:定义一个指向char类型的指针数组
这种方法是通过定义一个指向char类型的指针数组实现,数组中的每个元素都是一个指针,通过该指针可得到数组中的每个字符串。如对于上面的数组,C语言的定义代码如下:
char *wday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
两种方法对比
上面的两种方法都可以实现我们的目的,但在内存的占用上两种方法不同。第1种方法定义了一个5行20列的二维数组,即每个字符串所占的字节长度都为20个,所以共需要占用100个字节,而第2种方法是定义的指针数组,每个指针指向的字符串占用的字节长度是其实际长度,所以其总的长度肯定小于100个字节。综合来讲,第1种方法相对于第2种方法,造成了存储空间的浪费情况。
引用时,第一种方法:wday[i];
;第二种方法:wday[i];