2010-06-08 6 views
1

Je veux essayer d'écrire ma propre classe BigInt donc je me demande quel serait le moyen le plus efficace de trouver le dernier chiffre d'un nombre en C, en particulier pour une entrée qui serait un très grand int.Quel est le moyen le plus efficace pour trouver le dernier chiffre d'un int en C++?

+2

Est-ce que 'value & 0xF' fonctionnera? –

+1

Je suppose qu'il voulait dire base 10, Matt;) – schnaader

+2

Dépend de la base de la représentation que vous utilisez. – fredoverflow

Répondre

14
lastDigit = number % 10; 
+0

Bien sûr, ceci est défini par l'implémentation avec des nombres négatifs: – rlbond

+0

@rlbond, je pense que cela sera corrigé pour être négatif nombres négatifs en C++ 0x. @marndt, vous avez mal lu la question: 'number' voici un bigint et l'opérateur'% 'est à définir – avakar

+0

-1 car il ne répond pas vraiment à sa question, il veut connaître la meilleure façon de l'implémenter pour une classe personnalisée qu'il écrit, sinon vous êtes sur place Si vous implémentez une classe Int256 (par opposition à Int16, Int32, Int64) comment implémentez-vous% pour cette classe? N'utilisez pas l'héritage car il est uniquement défini pour les types prédéfinis .NET. – jcolebrand

3

Puisque vous avez affaire à l'entrée, la meilleure chose à faire serait de le lire comme une chaîne, et convertir le dernier caractère à une valeur de chiffres en soustrayant « 0 ».

4

Je suppose que votre BigInt utilise une implémentation en base 256, mais cela fonctionnerait aussi bien pour les bases 65536 ou plus grandes. Commencez par un exemple simple: BigInt (2828) sera stocké comme 11 * 256 + 12. Maintenant BigInt (2828)% 10 = (11 * 256 + 12)% 10 = ((11% 10) * (256% 10) + 12% 10))% 10 = (256% 10 + 2)% 10 = (6 + 2)% 10 = 8.

Les deux règles de base que vous allez appliquer sont (une + b)% 10 = (a% 10 + b% 10)% 10, et (a * b)% 10 = (a% 10 * b% 10)% 10. En l'occurrence, non seulement 256% 10 = = 6, mais (256^N)% 10 = (6^N)% 10 = 6. Cela simplifie énormément votre fonction LastDigit(). Donc, en supposant encore un BigInt B représenté comme une séquence d_N..d_0 avec base 256. Alors B% 10 est (6 * somme (d_i% 10) - 5 * (d_0% 10))% 10. Chaque terme dans la somme est au plus 9, évidemment. Par conséquent, vous pouvez sommairement sommer (ULONG_MAX/6) base 256 chiffres sans débordement, et la même chose s'applique à base-65536 et base-4294967296

Questions connexes