当我的数字从1开始而不是零时,我如何模数?

Dav*_*d B 27 modulo

我想解决这个问题的方法非常简单,但我已经考虑了一段时间,但却找不到优雅的解决方案.

我有一系列数字,例如1..10 = (1,2,3,4,5,6,7,8,9,10),它是圆形的,这意味着最后一个数字后面的数字又是第一个数字(next(10)=1).

对于i>0范围内的给定数字,我想计算下一个m和前m一个数字.例如next(5,1)=6 next(10,1)=1 next(10,2)=2 prev(5,2)=3 prev(1,1)=10 prev(1,2)=9.

对于next我可以采取(i+m)%n其中n在该范围的长度(n=10在本例中).但是因为prev我找不到一个优雅的解决方案.

gpv*_*vos 34

只需减去1并在之后加1.

在大多数编程语言中,您需要在查找"之前"值时注意,因为对于负数,模数在这种情况下不能正常工作:它返回负数.

这是C/C++版本:

int next(int i, int m, int n) { return (i + m - 1) % n + 1; }
int prev(int i, int m, int n) { return (i - m + n - 1) % n + 1; }
Run Code Online (Sandbox Code Playgroud)

但是,在Perl模数中总是返回一个正值(至少当第二个操作数是一个正整数时).基本上它做你想要的.所以你可以写下面的内容并省略+ $_[2]:

sub nxt { ($_[0] + $_[1] - 1) % $_[2] + 1; }
sub prv { ($_[0] - $_[1] - 1) % $_[2] + 1; }
Run Code Online (Sandbox Code Playgroud)


Aln*_*tak 7

next = (i + m) % n无论如何你不对 - 在某些情况下它会返回零.

试试这个:

next(i, m) = ((i - 1) + m) % n + 1
prev(i, m) = ((i - 1) + n - m) % n + 1
Run Code Online (Sandbox Code Playgroud)

实际上,取一个,然后找到正确的值,然后重新添加一个.

对于prev,n首先添加以确保您永远不会采用负数的模数