使用Zeller的同余来确定星期几

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

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

这是一个工作版本:

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

现场演示 。

关键是你的公式: 13/5*(m+1) 。 这是使用整数除法,它首先计算13/5 ,因此结果相当于2*(m+1) 。 交换5(m+1)左右,结果将是正确的。

顺便提一下,如果维基文章解释的话,你需要在1月/ 2月减少年份。

你为什么包括“h =年%100”和“j =年/ 100”?????

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