Correctness of Sakamoto's algorithm to find the day of week

后端 未结 4 645
余生分开走
余生分开走 2020-11-29 15:58

I am using Sakamoto\'s algorithm to find out the day of week from a given date. Can anybody tell me the correctness of this algorithm? I just want this from 2000 to 2099.

4条回答
  •  隐瞒了意图╮
    2020-11-29 16:28

    This might not be a complete answer like some mentioned above, But just would like to add one thing regarding this array : 0 3 2 5 0 3 5 1 4 6 2 4

    Consider months beginning from March and ending at February just like others said:

    1. March
    2. April
    3. May
    4. June
    5. July
    6. August
    7. September
    8. October
    9. November
    10. December
    11. January
    12. February

    Writing January to December from above numbering style :

    So consider this as an array : int t[] = {11,12,1,2,3,4,5,6,7,8,9,10};

    Now for all elements in array just do : (2.6*m - 0.2) mod 7 parse the result as integer and you will get this: 0 3 2 5 0 3 5 1 4 6 2 4

    • You can find this formula here : wikipedia
    int dayOfWeek(int d, int m, int y){
      // Months Array
      int t[] = {11,12,1,2,3,4,5,6,7,8,9,10};
    
      // Convert months array
      for (int i = 0; i < 12; i++){
        int ans = t[i] * 2.6 - 0.2;
        t[i] = ans % 7;
      }
    
      // Continue Algo
      if(m<3)
        y -= 1;
    
      int day = (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
      return day;
    }
    

    this : + y/4 - y/100 + y/400 is related to leap year. The algo to check for leap year is :

    1. Perfectly Divisible by 400 -> true
    2. IF perfectly divisible by 100 but not by 400 -> False
    3. Divisible by 4 -> True

    perform checks on above order. Maybe that is why they subtracted y/100 and added y/4 & y/400. Yeah silly logic

提交回复
热议问题