2

特定の場合、(> = 0)f(i, n, len, offset)から始まる整数の範囲を長さでラップする最短の計算は何ですか?nlenoffset

i   offset 0  offset 1  offset 2  offset 15
10  -> 10     -> 15     -> 14     -> 13
11  -> 11     -> 10     -> 15     -> 14
12  -> 12     -> 11     -> 10     -> 11
13  -> 13     -> 12     -> 11     -> 10
14  -> 14     -> 13     -> 12     -> 11
15  -> 15     -> 14     -> 13     -> 12

だからf(10, 10, 5, 1) = 15、、f(15, 10, 5, 1) = 14そしてf(10, 10, 5, 2) = 14

負の数または負のオフセットまたは0を超える範囲のボーナスカルマ。

4

1 に答える 1

1

「可能な限り最短」についてはわかりませんが、これはうまくいくようです:

f(int n, int base, int len, int offset)
{ int r = n - offset;
  if (r < base)
    r += len;
  return r;
}

baseただし、引数を追加する必要があります。そうしないnと、範囲に対して がどこにあるのかがわからないためです (たとえば、15 は 15 ~ 20 の範囲の最下部ですか、それとも 10 ~ 15 の最上位ですか?)。したがって、あなたの例は、、、などになりf(10, 10, 6, 1)ますf(15, 10, 6, 1)...

それが負の数および/または0にまたがる範囲で機能するかどうかを確認していませoffset > lenoffset %= len

于 2012-08-15T18:49:23.853 に答える