0
剰余演算を連続して除算することによってカウントするルーチンを考えてみましょう。整数でのカウント除算ベースのルーチン - 式のアプローチはありますか?
64ビットの被除数から始めて、ルーチンは定数除数で除算します。
剰余が0の場合、ルーチンはリターンします。
それ以外の場合は、剰余に2^32を掛けて整数商を加算することによって、新しい配当が構成されます。コードで
:任意の除数で
/// ULong - 64 bit, unsigned
/// UInt - 32 bit, unsigned
const UInt Divisor;
int TrickyCounter(ULong Dividend)
{
int count = 0;
Ulong Quotient;
UInt Remainder;
do {
Quotient = Dividend/Divisor;
Remainder = Dividend%Divisor;
assert((Quotient >> 32) == 0);
count = count + 1;
Dividend = ((ULong)Remainder << 32) + Quotient;
} while (Remainder != 0);
return count;
}
、所望数を得るために必要な配当を計算するために、好ましくは非反復方法はありますか?
多くの初期配当に対して、これはすぐに「アサート」条件に当てはまるようです。配当によってはこれが永遠に繰り返されるのだろうか?
返される番号を生成するために、計算の代わりに商が返された場合、配当を計算することはできますか?
Uint TrickyNumber(ULong Dividend, int count)
{
Ulong Quotient = 0;
UInt Remainder;
while (count > 0)
Quotient = Dividend/Divisor;
Remainder = Dividend%Divisor;
assert((Quotient >> 32) == 0);
count = count - 1;
Dividend = ((ULong)Remainder << 32) + Quotient;
}
return (UInt)Quotient;
}
正確にアサートの目的は何ですか?また、あなたの最後の質問に基づいて、2番目のコードスニペットはあなたが望むものではないようです。突然、最後の質問「いいえ」に対する答えを明らかにする反復回数を決定するために使用されるカウントパラメータがあります。 – mweerden
私は、最初のフォームに適用された最後のテキストで、他の終了条件はないという混乱についてお詫び申し上げます。 アサートは、2^32以下の商を2つのクリーンなピースを一緒にマージするようにします。 –