Это не могло бы быть полным ответом как некоторые упомянутые выше, Но просто хотело бы добавить одну вещь относительно этого массива: 0 3 2 5 0 3 5 1 4 6 2 4
Рассматривают месяцы, начинающиеся с марта и заканчивающиеся в февраль точно так же, как другие сказали:
Запись с января по декабрь из вышеупомянутого стиля нумерации:
Так рассматривают это как массив: int t[] = {11,12,1,2,3,4,5,6,7,8,9,10};
Теперь для всех элементов в массиве просто сделайте: (2.6*m - 0.2) mod 7
анализируют результат как целое число, и Вы получите это: 0 3 2 5 0 3 5 1 4 6 2 4
int dayOfWeek(int d, int m, int y){
// Months Array
int t[] = {11,12,1,2,3,4,5,6,7,8,9,10};
// Convert months array
for (int i = 0; i < 12; i++){
int ans = t[i] * 2.6 - 0.2;
t[i] = ans % 7;
}
// Continue Algo
if(m<3)
y -= 1;
int day = (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
return day;
}
это: + y/4 - y/100 + y/400
связан с високосным годом. Алгоритм для проверки в течение високосного года:
выполняют проверки на вышеупомянутом порядке. Возможно, именно поэтому они вычли y/100 и добавили y/4 & y/400. Да глупая логика рџ …
я знаю, что это не могло бы быть ответом, , Но это могло бы помочь тем, кто находит трудным помнить/понимать материал , да! не у всех нас есть высокие уровни IQ понимания материала, и печально некоторые из нас не могут помнить материал также, lol.
int dayToWeekG(int d,int m,int y){
int i;
int t[12]={0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
//{0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
y-=m<3;
i=(y+y/4-y/100+y/400 +t[m-1]+d)%7;
return i;
}
t[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
и выдерживают сравнение, он с календарем целого года (работайте cal 2
для генерации календаря в терминале в linux/unix), замечают стартовый день недели дня в течение каждого месяца.
i= y+y/4-y/100+y/400
y-=m<3
, но этим способом, которым мы также удаляем дополнительный день с невисокосных годов также. таким образом, мы заполним разрыв путем вычитания 1 дня в течение каждого месяца после февраля.
int t[12]={0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};