给定公历中的任何日期,任务是返回该特定日期的日期(星期一,星期二等)。
例子:
Input : Date: 13 July 2017 [13.07.2017]
Output : 4 i.e Thursday
Input : Date: 15 August 2012 [15.08.2012]
Output : 3 i.e Wednesday
Input : Date: 24 December 2456 [24.12.2456]
Output : 0 i.e Sunday
尽管有很多方法可以解决此问题,但最不为人知的也是功能最强大的方法之一是坂本智彦( Tomoohiko Sakamoto)的算法。
解释
公历1月1日1是公历中的星期一。
让我们考虑第一个没有leap年的情况,因此每年的总天数为365。一月有31天,即7 * 4 + 3天,因此2月1日的天总是比3天早1月1日这一天。现在的2月有28天(不包括years年),是7的确切倍数(7 * 4 = 28),因此行军月份将没有变化,并且也将提前3天考虑到该模式,如果我们创建每个月的前导天数数组,则将其表示为t [] = {0,3,3,6,1,4,4, 6、2、5、0、3、5}。
现在让我们看一下存在leap年的真实情况。每4年,我们的计算将增加1天。除非每隔100年没有发生一次。除非每隔400年这样做一次。这几天我们该如何处理?好吧,只需添加y / 4 – y / 100 + y / 400。注意,所有除法都是整数除法。这恰好增加了所需的of日数,但这是一个问题,the日是2月29日而不是1月0日,这意味着前两个月的the日应不计入当年。如果月份是一月或二月,则从年份中减去1。这意味着在这几个月中,y / 4值将是前一年的值,并且不会被计算在内。如果从2月之后的每个月的t []值中减去1?这样就可以填补空白,解决the年问题,也就是说,我们需要进行以下更改:
1.t []现在变为{0,3,2,5,5,0,3,5,1,4,4,6,2,4}。
2.如果m对应于1月/ 2月(即月<3),我们将y减1。
3.模数内的年增量现在为y + y / 4 – y / 100 + y / 400代替y。
以下是此算法的实现:
C++
// A CPP program to implement
// the Tomohiko Sakamoto Algorithm
#include
using namespace std;
// function to implement tomohiko
// sakamoto algorithm
int day_of_the_week(int y, int m, int d)
{
// array with leading number of days values
int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
// if month is less than 3 reduce year by 1
if (m < 3)
y -= 1;
return ((y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7);
}
// Driver Code
int main(void)
{
int day = 13, month = 7, year = 2017;
cout<<(day_of_the_week(year, month, day));
return 0 ;
}
// This code is contributed by Nikita Tiwari.
Java
// A java program to implement
// the Tomohiko Sakamoto Algorithm
class tomohiko_sakamoto
{
// function to implement tomohiko sakamoto algorithm
public static int day_of_the_week(int y, int m, int d)
{
// array with leading number of days values
int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
// if month is less than 3 reduce year by 1
if (m < 3)
y -= 1;
return (y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7;
}
// Driver Code
public static void main(String args[])
{
int day = 13, month = 7, year = 2017;
System.out.println(day_of_the_week(year, month, day));
}
}
Python3
# A Python 3 program to implement
# the Tomohiko Sakamoto Algorithm
# function to implement tomohiko
# sakamoto algorithm
def day_of_the_week(y, m, d) :
# array with leading number of days values
t = [ 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 ]
# if month is less than 3 reduce year by 1
if (m < 3) :
y = y - 1
return (y + y // 4 - y // 100 + y // 400 + t[m - 1] + d) % 7
# Driver Code
day = 13
month = 7
year = 2017
print(day_of_the_week(year, month, day))
# This code is contributed by Nikita Tiwari.
C#
// A C# program to implement
// the Tomohiko Sakamoto Algorithm
using System;
class GFG {
// function to implement tomohiko
// sakamoto algorithm
public static int day_of_the_week(int y,
int m, int d)
{
// array with leading number of days
// values
int []t = { 0, 3, 2, 5, 0, 3, 5, 1,
4, 6, 2, 4 };
// if month is less than 3 reduce
// year by 1
if (m < 3)
y -= 1;
return (y + y / 4 - y / 100 + y / 400
+ t[m - 1] + d) % 7;
}
// Driver Code
public static void Main()
{
int day = 13, month = 7, year = 2017;
Console.WriteLine(day_of_the_week(year,
month, day));
}
}
// This code is contributed by vt_m.
PHP
Javascript
输出:
4