📜  坂本智彦(Tomoohiko Sakamoto)的算法-查找星期几

📅  最后修改于: 2021-04-23 22:46:06             🧑  作者: Mango

给定公历中的任何日期,任务是返回该特定日期的日期(星期一,星期二等)。
例子:

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