【问题标题】:Determining day of the week using Zeller's Congruence使用 Zeller's Congruence 确定星期几
【发布时间】:2013-02-14 04:14:04
【问题描述】:

我尝试使用Zeller's Congruence 编写代码来查找给定日期的星期几,但我没有得到正确的输出。我的代码有什么问题?

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

【问题讨论】:

  • 从维基百科文章看来,您不应该在您使用的公式版本中减少年份。
  • @Yaniv 我尝试删除减量,但输出仍然不正确。

标签: c date dayofweek


【解决方案1】:

这是一个工作版本:

#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.

h 公式中的关键是:13/5*(m+1)。这是使用整数除法,先计算13/5,所以结果等价于2*(m+1)。将5(m+1) 互换,结果将是正确的。

顺便说一下,如果 1 月/2 月,您确实需要减少年份,正如 wiki 文章所解释的那样。

【讨论】:

  • 谢谢!所以既然是整数除法,就不需要下限了吧?
  • @Shail 是的,不需要地板
【解决方案2】:

为什么要包含“h= year % 100”和“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;
}

【讨论】:

  • 您包括“k= year % 100”和“j= year / 100”,因为 k 被定义为年份的最后两位,而 j 被定义为前两位。所以对于 2019 年,k 是 19,j 是 20。
猜你喜欢
  • 2010-11-13
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2013-01-09
  • 2021-06-29
相关资源
最近更新 更多