Betrachten Sie eine Routine, die durch sukzessive Division mit Restoperationen zählt.Zählen mit einer Integer Divide-basierten Routine - Gibt es einen formelhaften Ansatz?
Beginnend mit einem 64-Bit-Dividend teilt sich die Routine durch einen konstanten Divisor.
Wenn der Rest 0 ist, kehrt die Routine zurück.
Andernfalls wird ein neuer Dividend konstruiert, indem der Rest mit 2^32 multipliziert und der ganzzahlige Quotient addiert wird.
In Code:
/// 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;
}
mit einer beliebigen Divisor gibt es ein vorzugsweise nicht-Iterieren Verfahren die notwendige Dividend zur Berechnung der gewünschten Zählwert zu erhalten?
Für viele anfängliche Dividenden scheint dies schnell die Bedingung "Assert" zu treffen. Würden einige Dividenden dafür sorgen, dass sich das für immer wiederholt?
Wenn anstelle einer Zählung, kehrt die Routine der Quotient, kann ich berechnen die Dividende der Nummer I zurückgegeben werden soll produzieren?
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;
}
Was genau den Zweck der Assertion ist? Basierend auf Ihrer letzten Frage scheint der zweite Codeausschnitt nicht das zu sein, was Sie wollten. Plötzlich gibt es einen Anzahl-Parameter, der verwendet wird, um die Anzahl der Iterationen zu bestimmen, was natürlich die Antwort auf Ihre letzte Frage "Nein" ist. – mweerden
Ich entschuldige mich für die Verwirrung - der letzte Text für das erste Formular, das keine andere Exit-Bedingung hat. Die Assert hält den Quotienten unter 2^32, um zwei saubere Teile zusammenzuführen. –