使用模数旋转数字
本文关键字:旋转 数字 | 更新日期: 2023-09-27 18:02:20
我有一个函数(某种旋转)参数i
在[1001..999999]
范围:
int a = ((i - 1) % (1000000 - 1000) + 1001)
如你所见
i = 1001 a = 2001
...
i = 5000 a = 6000
...
i = 999999 a = 1999
我想逆这个函数,即有i = f(a)
,这样,如果,说,a = 6000
是给定的,我想要有5000
作为返回等。不幸的是,我遇到了反转%
(模操作)的问题。有什么建议可以轮换数字或颠倒上述公式吗?
如您所见,由于(1000000 - 1000)
是相当大的值,您得到的(i - 1) % (1000000 - 1000)
只有两种情况
i - 1 if i < 999001
i - 1 - 999001 if i >= 999001
为了求逆公式,你只需要分析这两种情况你就会像
一样简单 if (a > 2000)
return a - 1000;
else
return a + 998000;
测试 for (int i = 1001; i <= 999999; ++i) {
// forward, the formula from the question
int a = ((i - 1) % (1000000 - 1000) + 1001);
// ...and inverse one
int r = (a > 2000) ? a - 1000 : a + 998000;
// do we have reversed value != initial one?
if (r != i) {
// this will never happen
Console.Write("Counter example {0}", i);
break;
}
}