Determining day of the week using Zeller's Congruence

后端 未结 2 1914
北荒
北荒 2021-01-13 21:03

I tried writing the code for finding the day of the week for a given date using Zeller\'s Congruence but I\'m not getting the correct output. What\'s wrong with my code?

相关标签:
2条回答
  • 2021-01-13 21:30

    Here's a working version:

    #include <stdio.h>
    #include <math.h>
    int main()
    {
      int h,q,m,k,j,day,month,year;
      printf("Enter the date (dd/mm/yyyy)\n");
      scanf("%i/%i/%i",&day,&month,&year);
      if(month == 1)
      {
        month = 13;
        year--;
      }
      if (month == 2)
      {
        month = 14;
        year--;
      }
      q = day;
      m = month;
      k = year % 100;
      j = year / 100;
      h = q + 13*(m+1)/5 + k + k/4 + j/4 + 5*j;
      h = h % 7;
      switch(h)
      {
        case 0 : printf("Saturday.\n"); break;
        case 1 : printf("Sunday.\n"); break;
        case 2 : printf("Monday. \n"); break;
        case 3 : printf("Tuesday. \n"); break;
        case 4 : printf("Wednesday. \n"); break;
        case 5 : printf("Thurday. \n"); break;
        case 6 : printf("Friday. \n"); break;
      }
      return 0;
    }
    

    Live demo.

    The key is this in your h formula: 13/5*(m+1). This is using integer division, which calculates 13/5 first, so the result is equivalent to 2*(m+1). Swap the 5 and (m+1) around and the result will be correct.

    By the way you do need the year decrements if Jan/Feb, as the wiki article explains.

    0 讨论(0)
  • 2021-01-13 21:40

    Why do you include "h= year % 100" and "j= year / 100"?????

    #include <stdio.h>
    #include <math.h>
    int main()
    {
      int h,q,m,k,j,day,month,year;
      printf("Enter the date (dd/mm/yyyy)\n");
      scanf("%i/%i/%i",&day,&month,&year);
      if(month == 1)
      {
        month = 13;
        year--;
      }
      if (month == 2)
      {
        month = 14;
        year--;
      }
      q = day;
      m = month;
      k = year % 100;
      j = year / 100;
      h = q + 13*(m+1)/5 + k + k/4 + j/4 + 5*j;
      h = h % 7;
      switch(h)
      {
        case 0 : printf("Saturday.\n"); break;
        case 1 : printf("Sunday.\n"); break;
        case 2 : printf("Monday. \n"); break;
        case 3 : printf("Tuesday. \n"); break;
        case 4 : printf("Wednesday. \n"); break;
        case 5 : printf("Thurday. \n"); break;
        case 6 : printf("Friday. \n"); break;
      }
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题