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;
}

任意の除数を使用して、目的のカウントを取得するために必要な 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;
}
4

1 に答える 1