除算と剰余演算を連続してカウントするルーチンを考えてみましょう。
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;
}
任意の除数を使用して、目的のカウントを取得するために必要な Dividend を計算するための非反復方法はありますか?
多くの最初の配当では、これはすぐに「アサート」状態になるようです。いくつかの配当により、これは永遠にループしますか?
ルーチンがカウントの代わりに商を返す場合、返される数を生成するために配当を計算できますか?
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;
}