我尝试使用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;
}
答案 0 :(得分:3)
这是一个有效的版本:
#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;
}
关键在于h
公式:13/5*(m+1)
。这是使用整数除法,首先计算13/5
,因此结果等同于2*(m+1)
。交换5
和(m+1)
左右,结果将是正确的。
顺便提一下,如果维基文章解释的那样,你需要在1月/ 2月减去年份。
答案 1 :(得分:0)
为什么要包括&#34; h =年%100&#34;和&#34; j =年/ 100&#34; ?????
#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;
}