使用模数旋转数字

本文关键字:旋转 数字 | 更新日期: 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;
    }
  }