扣除月份的日期'换行'

时间:2008-11-10 08:21:11

标签: algorithm

对于一个月的计算,1 - 1 = 12的数学方法是什么?添加很容易,12 + 1%12 = 1,但减法引入0,填充东西。

我的实际要求是x = x + d,其中x在求和之前和之后必须始终在1到12之间,并且d任何无符号整数。

4 个答案:

答案 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

当值的范围不受控制时,这种双模运算是解决这类问题的常见部分。