Определение дня недели с использованием конгруэнтности Целлера

Я попытался написать код для поиска дня недели на определенную дату с использованием Конгруэнции Целлера, но я не получаю правильный вывод. Что случилось с моим кодом?

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

Демо-версия .

Ключ это в вашей формуле h : 13/5*(m+1) . Это использует целочисленное деление, которое сначала вычисляет 13/5 , поэтому результат эквивалентен 2*(m+1) . Поменяйте 5 и (m+1) вокруг, и результат будет правильным.

Кстати, вам нужны декреты года, если январь / февраль, как объясняет статья wiki.

Почему вы включаете «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; }