Bien que la technique consistant à convertir en une chaîne de caractères puis à additionner les chiffres décimaux soit élégante, elle nécessite une division ou est inefficace dans l'étape de conversion en une chaîne de caractères. Existe-t-il un moyen d'appliquer l'idée directement à un nombre binaire, sans avoir à le convertir d'abord en une chaîne de chiffres décimaux ?
Il s'avère que oui :
Étant donné un nombre binaire, la somme de ses bits impairs moins la somme de ses bits pairs est divisible par 3 si le nombre original était divisible par 3.
Par exemple, prenons le nombre 3726, qui est divisible par 3. En binaire, cela donne 111010001110
. Nous prenons donc les chiffres impairs, en commençant par la droite et en allant vers la gauche, qui sont [1, 1, 0, 1, 1, 1] ; la somme de ceux-ci est de 5 . Les bits pairs sont [0, 1, 0, 0, 0, 1] ; la somme de ceux-ci est 2 . 5 - 2 = 3, ce qui nous permet de conclure que le nombre original est divisible par 3.
48 votes
C'est une question d'entretien plutôt stupide, n'est-ce pas ? Elle ne teste pas vraiment vos connaissances en programmation, mais plutôt si vous connaissez ou non des propriétés obscures sur les nombres...
5 votes
Une autre de ces questions d'entretien stupides... cela n'a rien à voir avec les compétences en programmation. Cela prouverait simplement que vous savez (peut-être par hasard) que la somme des chiffres doit être divisible par 3 (ce que je ne savais pas/ne me rappelais pas, honnêtement ;) ).
9 votes
Ça pourrait aussi être une question d'examen de mon professeur d'université. Ce type n'a jamais travaillé sur de vrais projets mais a pensé que de telles questions refléteraient le monde réel. ha.
15 votes
J'ai essayé d'imaginer un épisode de MacGuyver dans lequel il aurait besoin de cette bribe de connaissance, mais cela défie même cela.
3 votes
Je ne voudrais pas travailler pour quelqu'un qui même a demandé une telle question lors d'un entretien. C'est insultant. Ils pourraient aussi bien dire "OK, maintenant sélectionnez Comic Sans MS dans Word, et tapez une phrase pour moi".
2 votes
C'est en fait une bonne question pour briser la glace, mais elle ne doit bien sûr pas être utilisée lors d'un entretien avec des développeurs expérimentés. Ce n'est pas vraiment difficile, mais cela vous montrera quand même comment un développeur junior aborde une tâche de codage. Les implémentations typiques nécessitent une récursion, par exemple - sans récursion, l'astuce "ajoute à 3,6,9" échoue sur 3333.
0 votes
Cette question ressemble à un doublon de stackoverflow.com/questions/844867/
25 votes
Ce que les gens semblent oublier, c'est qu'il n'est pas nécessaire de connaître des propriétés obscures des nombres pour résoudre ce problème. Ce que vous debe si vous vous appelez un informaticien, c'est ça : Pour tout langage auquel il manque un certain nombre d'opérateurs mathématiques, mais qui est néanmoins complet au sens de Turing, vous pouvez réimplémenter vous-même tous les opérateurs manquants.
0 votes
Une référence intéressante est hackersdelight.org/divcMore.pdf (Hacker's Delight, chapitre sur la division par des nombres-multiplications magiques), p. 15 ; la
remu3()
Cette fonction est très similaire à la réponse de MSalter ci-dessous, mais le document donne quelques possibilités supplémentaires pour résoudre (efficacement) ce problème.0 votes
Je pense que tu voulais dire
itoa()
noatoi()
. Maisitoa()
utilise la division, elle ne devrait donc pas être utilisée également.