使用模数

时间:2016-08-15 07:52:09

标签: c#

我在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%不幸的是,我遇到了反转case XmlPullParser.START_TAG: if(name.equals("temperature")) result[0] = parser.getAttributeValue(null,"value"); break; 模运算)的问题。旋转数字或反转上述公式有什么建议吗?

1 个答案:

答案 0 :(得分:1)

正如您所看到的那样,由于(1000000 - 1000)非常 greate 一个值,因此只需两个案例就可以获得(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;
    }
  }