7
votes

Fonction qui trouve combien de fois n peut être divisé en deux

Fondamentalement, j'ai besoin d'une fonction qui divisera N par deux et retournera le nombre de fois que cela peut être fait.

codage jusqu'à présent: p>

>>> div(4)
2
>>> div(7)
2


2 commentaires

Lorsque vous dites que "N peut être divisé en deux", voulez-vous dire que n / 2 est un entier, ou que N / 2> = 1? Votre code actuel vérifie ce dernier, je crois.


Vous devez clarifier si n est un entier, comme autrement n peut être divisé à moitié infini.


8 Réponses :


8
votes

/ n'effectue pas d'affectation. Puisque vous retournez n et ne changeez pas sa valeur, je pense que vous devriez commencer là. Vos autres astuces sont = et%.


0 commentaires

24
votes

Un entier n peut être divisé par 2 : plancher (log (n) / journal (2))


1 commentaires

Ou plus court: plancher (log (n, 2)) ?



1
votes

Je vois au moins deux façons de le faire:

opération bitwise ( Shift ): xxx

et xxx


0 commentaires

5
votes

(Notez que je prends vos exemples comme définissant le comportement attendu de la fonction. Comme Tomas et Carl notait, la description n'est pas particulièrement claire.)

Les versions récentes de Python fournissent en fait un bit_length () code> méthode sur des entiers qui facilitent la recherche de la réponse. P>

Bien que cela ne vous aide pas vraiment avec votre question de devoirs (cela vous donne la réponse, mais cela ne vous aide pas à comprendre pourquoi em> C'est la réponse), vous pouvez l'utiliser pour créer une fonction de référence à comparer avec votre réponse réelle: P>

def expected(n):
    return n.bit_length() - 1

>>> expected(4)
2
>>> expected(7)
2
>>> expected(33)
5
  • Votre état de boucle n'est pas correct, car une division répétée ne réduira jamais une valeur inférieure à zéro. Compte tenu des données d'exemple, votre condition de terminaison doit être quelque chose de différent. Considérons les réponses que vous attendez des entrées de 0 code>, 1 code> ou 2 code>. Li>.
  • Vous devez modifier la valeur de n code> sur chaque passage à travers la boucle. Sinon, votre boucle ne finira jamais. Li>
  • est n code> vraiment la valeur que vous voulez retourner? Peut-être que vous devriez faire quelque chose d'autre que vous devriez suivre lorsque vous allez autour de la boucle qui deviendra votre valeur de retour (un regard plus étroit sur certaines des autres réponses suggérées devrait aider à ce point). Li> ul> p>


0 commentaires

0
votes

L'interprétation est la suivante: combien de fois pouvez-vous la réduire de moitié (jeter le reste) jusqu'à 0; suppose des entiers 32 bits?

   >>>print div(100)
   6
   >>>print div(1000)
   9
   >>>print div(1025)
   10


0 commentaires

1
votes

Voici une fonction qui compte le nombre de fois qu'un chiffre N peut être divisé par un autre numéro P (2 dans ce cas) à l'aide du modulo: xxx


0 commentaires

2
votes

La fonction interne divmod est la clé: xxx


1 commentaires

En fait, la réponse devrait être 2.



0
votes

La divisibilité est définie comme suit: Un entier est divisible par un autre entier uniquement si le résultat de cette division est également un entier (pas une fraction, pas de reste).

Voir le Définition mathématique .

Par exemple, 15 est divisible par 3 et 5 mais pas divisible par 2.
Compte tenu de cette définition, la réponse hautement notée ci-dessus, plancher (log (n) / journal (2) est complètement faux.

Par exemple:
3 ^ 10 = 59,049
Ce nombre est impair et seulement divisible par 3.
Donc compte-2-divisions (3 ^ 10) = 0 L'expression plancher (journal (3 ^ 10) / journal (2) = 15 .


1 commentaires

Clarifier, étant donné la définition de l'exemple de fonction div (7) = 2, cette réponse est correcte, mais ce n'est pas une divisibilité, c'est autre chose. En fait, c'est exactement cela, le logarithme, la base 2, d'un numéro. En termes d'arithmétique entier, vous informez réellement la puissance de deux qui est la plus proche, mais moins que le numéro d'entrée. Dans l'exemple que j'ai donné ci-dessus, c'est 2 ^ 15, ou 32 768.