Considérons une routine qui compte par opérations successives de division w/reste. À partir d'un dividende de 64 bits, le sous-programme divise par un diviseur constantComptage avec une routine Integer Divide - Existe-t-il une approche stéréotypée?
Si le reste est 0, la routine revient.
Sinon, un nouveau dividende est construit en multipliant le reste par 2^32 et en ajoutant le quotient entier.
Dans le 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;
}
Avec un diviseur arbitraire, il est de préférence un procédé non-itération pour calculer le dividende nécessaire pour obtenir le nombre souhaité?
Pour beaucoup de dividendes initiaux, cela semble rapidement atteindre la condition "Assert". Est-ce que certains dividendes provoqueraient cette boucle pour toujours? Si, au lieu d'un nombre, la routine renvoie le quotient, puis-je calculer le Dividende pour produire le nombre que je veux renvoyer?
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;
}
Quel est exactement le but de l'assert? En outre, selon votre dernière question, le deuxième extrait de code ne semble pas être ce que vous vouliez. Soudain, il y a un paramètre count qui est utilisé pour déterminer le nombre d'itérations, ce qui fait que la réponse à votre dernière question est 'non'. – mweerden
Je m'excuse pour la confusion - le dernier texte appliqué au premier formulaire, qui n'a aucune autre condition de sortie. L'affirmation maintient le quotient en dessous de 2^32 pour avoir deux pièces propres à fusionner ensemble. –