58
задан 31 July 2012 в 11:04

2 ответа

Это не могло бы быть полным ответом как некоторые упомянутые выше, Но просто хотело бы добавить одну вещь относительно этого массива: 0 3 2 5 0 3 5 1 4 6 2 4

Рассматривают месяцы, начинающиеся с марта и заканчивающиеся в февраль точно так же, как другие сказали:

  1. март
  2. апрель
  3. май
  4. июнь
  5. июль
  6. август
  7. сентябрь
  8. октябрь
  9. ноябрь
  10. декабрь
  11. январь
  12. февраль

Запись с января по декабрь из вышеупомянутого стиля нумерации:

Так рассматривают это как массив: 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 связан с високосным годом. Алгоритм для проверки в течение високосного года:

  1. Совершенно Делимый 400-> верный
  2. , ЕСЛИ совершенно делимый 100, но не 400-> Ложь
  3. Делимый 4-> Верный

выполняют проверки на вышеупомянутом порядке. Возможно, именно поэтому они вычли y/100 и добавили y/4 & y/400. Да глупая логика 🠘 …

я знаю, что это не могло бы быть ответом, , Но это могло бы помочь тем, кто находит трудным помнить/понимать материал , да! не у всех нас есть высокие уровни IQ понимания материала, и печально некоторые из нас не могут помнить материал также, lol.

1
ответ дан 1 November 2019 в 13:54

Для Григорианского календаря

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), замечают стартовый день недели дня в течение каждого месяца.

  • Каждый нормальный год, смещая один день недели и високосного года, смещая два дня недели. как (365%7) =1 и (366%7) =2
 i= y+y/4-y/100+y/400
  • , Но мы, не должен вычислять дополнительный день, если y является високосным годом в течение месяца 0 и 1
y-=m<3
  • , но этим способом, которым мы также удаляем дополнительный день с невисокосных годов также. таким образом, мы заполним разрыв путем вычитания 1 дня в течение каждого месяца после февраля.

    int t[12]={0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

0
ответ дан 1 November 2019 в 13:54

Другие вопросы по тегам:

Похожие вопросы: