Determining day of the week using Zeller's Congruence

拈花ヽ惹草 提交于 2020-01-11 06:08:51

问题


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?

#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 + floor(13/5*(m+1)) + k + floor(k/4) +  floor(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;
}

回答1:


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.




回答2:


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;
}


来源:https://stackoverflow.com/questions/15127615/determining-day-of-the-week-using-zellers-congruence

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!