对于一个月的计算,1 - 1 = 12的数学方法是什么?添加很容易,12 + 1%12 = 1,但减法引入0,填充东西。
我的实际要求是x = x + d,其中x在求和之前和之后必须始终在1到12之间,并且d任何无符号整数。
答案 0 :(得分:3)
假设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
答案 1 :(得分:2)
我在内部使用基于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
答案 2 :(得分:0)
你必须小心添加,因为(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
答案 3 :(得分:0)
%(模数)运算符为x%N生成0 ..(N-1)范围内的答案。假设您的输入在1..N范围内(对于N = 12),则一般添加将正数y个月添加到当前月x的代码应为:
(x + y - 1) % 12 + 1
当y为1时,这将减少为
x % 12 + 1
减法基本相同。然而,当操作数中的任一个(或两个)为负时,由模数运算符的不同实现产生的答案存在复杂性。如果已知要减去的数字在1..N的范围内,则可以使用减去y模N的事实与添加(N-y)模N相同的事实。如果y不受约束(但是正数) ),然后使用:
(x + (12 - (y % 12) - 1) % 12 + 1
当值的范围不受控制时,这种双模运算是解决这类问题的常见部分。