2012-03-16 41 views
1

Je voudrais un alogrithm qui utiliserait seulement des opérations de décalage, ajouter ou soustraire pour trouver si un nombre est un multiple de 6. Donc, fondamentalement juste des opérations binaires. Jusqu'ici, je pense que je devrais logiquement déplacer le nombre deux fois pour diviser par 4 et ensuite soustraire 6 une fois. Mais je sais que quelque chose ne va pas avec mon approche et je n'arrive pas à comprendre quoi.Comment vérifier si un nombre est un multiple de 6?

+0

Vous pouvez continuer à soustraire 6 du nombre et voir qu'il est à zéro. Si le résultat est inférieur à zéro, alors il n'est pas divisible par 6 –

+0

Pas exactement efficace, mais vous pouvez implémenter une fonction de module en utilisant seulement la soustraction. – st0le

+1

Si cela est utilisé dans un vrai programme: ne faites pas cela. Utilisez simplement 'num% 6', et laissez le compilateur déterminer quelle est la méthode la plus rapide. Il est plus que probable que l'utilisation de l'opération 'mod' du processeur sera plus rapide que n'importe quel hack que vous aurez créé. –

Répondre

0

diriez-vous de garder en soustrayant le nombre de 6 jusqu'à ce que il atteint zéro. Si vous obtenez zéro le nombre est divisible par 6 sinon, non. OU continuez à diviser le nombre par 2 (opération de décalage sur binaire) jusqu'à ce que le nombre soit inférieur à 12. puis soustrayez 6 de ce nombre. Si inférieur à zéro (non divisible) si zéro divisible. si elle n'est pas soustraite 3 Si inférieur à zéro (non divisible) si zéro divisible.

0
Reference: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_6 

It is a multiple of six if BOTH of the following statements are true: 
1) The last digit (ones place) is 0, 2, 4, 6, or 8. 
2) When you add all the digits together, you get a multiple of 3. 


Reference: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_3 

1) Start with a number N. 
2) Sum the digits of the number, and get M. 
3) If M is larger than 10, set N=M and return to stage 2. 
4) Otherwise, M is now smaller than 10. If M is 0,3,6 or 9, then N is a multiple of 3 
+0

Maintenant, expliquez, comment allez-vous ajouter tous les chiffres sans utiliser la division? – st0le

+0

Référence: http://wiki.answers.com/Q/How_can_you_tell_if_a_number_is_a_multiple_of_6 – Java42

+0

Mec, comment voulez-vous additionner tous les chiffres sans utiliser mod ou div ou en le convertissant en chaîne? – st0le

0

Vous pourriez essayer d'implémenter un algorithme de division avec les opérations primitives disponibles. L'algorithme long division de base de la 4e année pourrait être assez (juste faire les choses dans la base 2 au lieu de la base 10, au lieu de la multiplication opérateurs de bits)

7

1) Simple (N & 1) == 0 pour vérifier si le nombre est divisible par 2.

2) Utilisez la réponse Bit bidouille (du fil This.) pour vérifier la divisibilité par 3.

Si les deux sont vrais, votre nombre est divisible par 6.

+1

Hmmph. Battez-moi par une minute, mais je me suis connecté à [le hack] (http://stackoverflow.com/a/3421654/487339) directement. : ^) – DSM

+0

@ DSM, j'ai remarqué. :RÉ – st0le

0

OK. Voici comment je vais y aller (juste une première pensée):

Un multiple de 6 est à la fois un multiple de 2 et 3, il devrait donc satisfaire les critères de divisibilité de 2 et 3 en même temps ... Alors ...

  • Vérifiez divisibilité par 2:

    1. décalage vers la droite le nombre
    2. Si reste> 1, répéter 1.
    3. Si reste = 1, alors FALSE, sinon continuez.

      La vérification de la divisibilité par 2, pourrait évidemment être également mise en œuvre par (N & 1 == 0), comme indiqué ci-dessus. Cela permet de vérifier simplement le dernier chiffre de la représentation binaire de N: si elle est 1, N est impair (donc pas divisible par 2), si elle est 0, il est parfaitement divisible ...

  • Vérifier divisibilité par 3 :
    1. Soustraire 3.
    2. Si reste> 3, répéter 1.
    3. Si reste> 0, FALSE, sinon TRUE.
0

Si nous étendons la gamme des opérations à "bit-masquage" et "bit-shifting", il est simple.

Comme certains l'ont dit, la divisibilité par deux est équivalente à (n & 1) == 0. La divisibilité par 3 est (relativement) facile en binaire. Initialiser un accumulateur a à 0, puis répéter a += (n & 3); n = (n >> 2); jusqu'à ce que n soit 0. Si (et seulement si) a est 3 est n divisible par 3.

Questions connexes