Дата 'перенос' в вычитании месяцев - PullRequest
3 голосов
/ 10 ноября 2008

Что такое математический способ сказать 1 - 1 = 12 для расчета месяца? Добавление легко, 12 + 1% 12 = 1, но вычитание вводит 0, заполняя вещи.

Мое действительное требование - x = x + d, где x всегда должно быть от 1 до 12 до и после суммирования, а d - любое целое число без знака.

Ответы [ 4 ]

3 голосов
/ 10 ноября 2008

Предполагая, что x и y находятся в диапазоне 1-12:

((x - y + 11) % 12) + 1

Чтобы сломать это:

// Range = [0, 22]
x - y + 11

// Range = [0, 11]
(x - y + 11) % 12

// Range = [1, 12]
((x - y + 11) % 12) + 1
2 голосов
/ 10 ноября 2008

Я бы работал внутри с месяцем, основанным на 0 (0-11), суммируя один только для внешнего потребления (вывод, другой метод вызова, ожидающий 1-12 и т. Д.), Так что вы можете так же легко обернуться назад как оборачиваясь вперед.

>>> for i in range(15):
...  print '%d + 1 => %d' % (i, (i+1)%12)
...
0 + 1 => 1
1 + 1 => 2
2 + 1 => 3
3 + 1 => 4
4 + 1 => 5
5 + 1 => 6
6 + 1 => 7
7 + 1 => 8
8 + 1 => 9
9 + 1 => 10
10 + 1 => 11
11 + 1 => 0
12 + 1 => 1
13 + 1 => 2
14 + 1 => 3
>>> for i in range(15):
...  print '%d - 1 => %d' % (i, (i-1)%12)
...
0 - 1 => 11
1 - 1 => 0
2 - 1 => 1
3 - 1 => 2
4 - 1 => 3
5 - 1 => 4
6 - 1 => 5
7 - 1 => 6
8 - 1 => 7
9 - 1 => 8
10 - 1 => 9
11 - 1 => 10
12 - 1 => 11
13 - 1 => 0
14 - 1 => 1
0 голосов
/ 10 ноября 2008

Оператор% (модуль) выдает ответ в диапазоне 0 .. (N-1) для x% N. Учитывая, что ваши входные данные находятся в диапазоне 1..N (для N = 12), общее добавление код для добавления положительного числа y месяцев к текущему месяцу x должен быть:

(x + y - 1) % 12 + 1

Когда у равен 1, это уменьшается до

x % 12 + 1

Вычитание в основном то же самое. Однако существуют сложности с ответами, полученными различными реализациями оператора модуля, когда один или оба операнда отрицательны. Если известно, что вычитаемое число находится в диапазоне 1..N, то вы можете использовать тот факт, что вычитание y по модулю N равнозначно сложению (N - y) по модулю N. Если y является неограниченным (но положительным) ), затем используйте:

(x + (12 - (y % 12) - 1) % 12 + 1

Эта операция с двумя модулями является общей частью решения таких проблем, когда диапазон значений не контролируется.

0 голосов
/ 10 ноября 2008

Вы также должны быть осторожны с сложением, так как (11 + 1)% 12 = 0. Попробуйте это:

x % 12 + 1

Это происходит от использования функции нормализации:

norm(x) = ((x - 1) % 12) + 1

Подставив

norm(x + 1) = (((x + 1) - 1) % 12 + 1

norm(x + 1) = (x) % 12 + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...