-2

0 から 10 までの数字を選択する必要があるとしましょう。

私が選んだ数字は6です。

次に選びたい数字は0です。

ここでのルールは、数値を 1 ずつ増やすか 1 ずつ減らす必要があるということです。数値は最後の数値をラップすることもできます。

ここで最も重要なことは、どの方向に進むのが最も短いかを見つけることです。

そう

6-5-4-3-2-1-0 = 7 moves.
6-7-8-9-10-0 = 6 moves.

したがって、この場合はインクリメントが勝ちます。

さて、私はこのコードを思いつきました(おそらく壊れています)

int movesInc = 1;
int movesDec = 1;
int curNumber = 6;
int nextNumber = 0;
while((curNumber-- % 11) != nextNumber)
    movesDec++;

while((curNumber++ % 11) != nextNumber)
    movesInc++;

両方向で while ループを使用する代わりに..そしてどちらがより少ない動きをするかを見つける..

whileループなしでこれを行う方法はありますか? たぶん、ある種の数式ですか?

4

2 に答える 2

3

あなたのコードは、実際には次の 2 つの理由で適切に動作しません。

モジュロ 10 ではなく 11 で作業する必要があります (以前のコメントでこれを修正したようです)。

Java と C++の%演算子は、あなたが考えるように符号を扱いません。

これはきれいではありませんが、うまくいきますし、ループも必要ありません。

6 で開始し、0 で終了するようにテストされており、一般的に動作することを期待しています。範囲が異なる場合は、もちろん、結果が負になったときに加算される数値を変更する必要があります。

    int curNumber = 6;
    int nextNumber = 0;
    int movesInc = (nextNumber - curNumber) + 1
                    + ((nextNumber > curNumber)? 0: 11);
    int movesDec = (curNumber - nextNumber) + 1
                    + ((nextNumber < curNumber)? 0: 11);

これ+ 1は、両方のエンドポイントをカウントしているためです。三項式は、0 の周りを処理するものです。

于 2012-01-29T13:28:08.897 に答える
1
int curNumber;
int nextNumber;
//calculate the modulo size by the highest number
int module = 10 + 1;
//calculate the direct distance to the nextNumber
int directDist = nextNumber - curNumber;

int nextNumberWrapped;
//calculate the wrapped distance, deciding the direction which wraps
if(directDist < 0)
    //wrapping in positive direction: 10 -> 0
    nextNumberWrapped = nextNumber + module;
else
    //wrapping in negative direction 0 -> 10
    nextNumberWrapped = nextNumber - module;
//calculating the wrapped distance
int wrappedDist = nextNumberWrapped - curNumber;
//assume the directDist to be shortest
int shortestDist = directDist;
//proof wrong if neccessary (compare the distances absolute values)
if(abs(wrappedDist) < abs(directDist))
   //save the signed distance
   shortestDist = wrappedDist;

shortestDist の絶対値は最短距離の長さを示し、記号は方向を示します。したがって、符号が負の場合はデクリメントする必要があり、正の場合はインクリメントして最短の道を進む必要があります。

http://ideone.com/0yCDw

また、あなたの例は間違っているようです。数字の間の各 - は 1 つのステップであり、数えたよりも 1 つのステップが少なくなります。

6-5-4-3-2-1-0
 ^ ^ ^ ^ ^ ^
 1 2 3 4 5 6  -> 6 moves
6-7-8-9-10-0
 ^ ^ ^ ^  ^ 
 1 2 3 4  5 -> 5 moves
于 2012-01-29T13:00:38.240 に答える