6
votes

Python de multiplication paysanne russe 3.3

J'ai besoin d'aide pour un programme de Python 3.3 censé faire la multiplication paysanne russe / une ancienne multiplication égyptienne. L'affectation indique: "Si" A "et" B "sont les deux entiers à se multiplier, nous multiplierons à plusieurs reprises" A "par 2 et divisez" B "par 2, jusqu'à ce que" B "ne puisse pas se diviser et ne pas zéro ( division entière). Lors de chaque ensemble de multiplication "A" et divisant "B", si la valeur de "B" est un nombre impair, vous ajoutez quelle que soit la valeur "A", c'est à la fin. À la fin, la somme de Toutes les valeurs "A" (lorsque "B" est impair) doit être égale au produit des entrées d'origine "A" et "B". En bref, résumer toutes les valeurs "A" pour lesquelles "B" est impair Et ce sera égal (ou fermer) au produit de "A" et "B".

Edit EM> P>

J'ai peut-être formé une partie de la question de la question.

Voici un exemple: p>

si "A" est 34, et "B" est 19, multipliant "A" par deux et divisant "B" par deux chaque ligne. p>

"A" "B" p>

(34) (19) ("B" est impair, ajoutez "A" au total) p>

(68) (9 ) ("B" est étrange, ajoutez "A" au total) p>

(136) (4) ("B" est même, ignore "une valeur") p>

(272 ) (2) ("B" est EV fr, ignorer "une valeur") p>

(544) (1) ("B" est impair, ajoutez "A" au total) p>

lorsque vous résumez toutes les valeurs de " A "pour lequel" b "est étrange, vous obtenez (34 + 68 + 544 = 646), qui est égal à la multiplication "A" et "A" et "B", (34 * 19 = 646). P>

La pièce avec qui j'ai du mal à ajouter est d'ajouter "A" à un total chaque fois que "B" est un nombre impair. p>

C'est ce que j'ai jusqu'à présent, P>

x = int(input("What is the first number? "))
y = int(input("What is the second number? "))
answer = 0

while y != 0:
    if (y%2 != 0):
        x*2
        y//2
        answer == answer + x
    if (y%2 == 0):
        x*2
        y//2
print("the product is",(answer))


5 commentaires

Votre code ne réaffecte pas non plus y ou x . Vous devez remplacer x * 2 et y // 2 avec x = x * 2 et y = y // 2 < / code> respectueusement.


Ça ne fait rien. Je pense que je n'ai mal compris pas votre explication.


Vous n'abandonnez pas à réponse non plus. Vous êtes test si réponse est égal à réponse + x . Utilisez un Single = pour assigner ou mieux encore, utilisez l'addition in-place: réponse + = x .


Faites 2 une variable pour que vous puissiez tester si cela fonctionne avec d'autres valeurs. Des points supplémentaires peuvent être donnés


Comment puis-je répéter le programme lorsque je demande à l'utilisateur s'ils veulent exécuter le code à nouveau avec de nouvelles entrées?


4 Réponses :


3
votes

Je ne connais pas l'algorithme que vous essayez de mettre en œuvre, mais j'ai apporté quelques modifications à votre code.

x = int(input("What is the first number? "))
y = int(input("What is the second number? "))
answer = 0

# != 0 is redundant: y is True if it is not 0
while y:
    # no need to have parentheses here
    if y % 2:
        # this needs to be an assignment, not a check for equality
        answer += x  # shorthand for answer = answer + x
    # These happen every time, so does not need to be inside the if
    # these also need to be an assignment, not just an expression
    x *= 2
    y /= 2
# total was never defined
print("the product is", (answer))


0 commentaires

3
votes

Vous devez d'abord ajouter X pour répondre en premier, puis mettre à jour x

voici le code correct xxx


2 commentaires

Calcul du prochain x et le prochain y est identique dans les commandes si . De cette façon, il peut être déplacé en dehors du si (les valeurs sont calculées dans chaque boucle et toujours de la même manière). Ensuite, le deuxième si devient vide et peut être supprimé. Ensuite, le Y% 2! = 0 est la même (mais plus la version obscure) comme y% 2 == 1 . La plus tardive est juste juste une conversion explicite en bool, tandis que le Y% 2 est la valeur qui sera interprétée comme vraie dans le contexte booléen.


Je savais que quand j'ai écrit cette réponse. J'essayais de changer de changement minimale à la question de l'intérêt de l'intérêt afin qu'il puisse mieux comprendre où il s'est trompé.



0
votes

une note latérale. Franchement, je ne connaissais pas l'algorithme jusqu'à présent. Plus cela me surprends, il a été utilisé par des Égyptiens antiques ou dans la vieille Russie. (En réalité, j'ai tendance à croire que l'origine russe est plus probable qu'il paraisse que les nations slaves sont directement liées aux anciens étrusques).

La vieille origine me surprend parce que c'est en fait une multiplication faite à la main que vous avez appris dans l'école de base. La seule différence est que les chiffres sont convertis en la représentation binaire en premier. Plutôt orienté machine, n'est-ce pas? :)

Pour les chiffres de la question, la représentation décimale est égale à 100010 en binaire, le 19 en décimal est de 10011 en binaire. Maintenant, la multiplication de l'école de base simple sur papier: xxx

Il semble que celui qui a conçu le métod (dans les temps anciens) savait quels sont les numéros binaires. < / p>


0 commentaires

0
votes

La dernière fois que vous ajoutez X est quand y est égal à 1. Si vous continuez à réduire de moitié le nombre atteint 0, il prendra un très grand nombre d'itérations (logiquement, cela prendra pour toujours).

penser à 2x2. Si vous doublez X à 4 et coupez-vous de moitié Y à 1, X est votre réponse. P>

En d'autres termes, pensez à y code> comme combien de x j'ai besoin de produire une réponse code>. Puisque vous ne pouvez pas me multiplier, il suffit d'ajouter / double / réduire de moitié, vous avez un choix - vous pouvez attendre que Y soit 2, puis ajouter une valeur doublée de x ou vous pouvez attendre que Y soit 1 et simplement ajouter une valeur ajoutée de X. Ce dernier est plus simple et plus clair, c'est tout. P>

Je pense qu'il est plus clair dans ce cas d'utiliser un pendant que TRUE code> boucle: p>

def mult2(x, y):
    """aka 'Russian peasant method'; allowed: addition, halving, doubling."""
    if y==1:
        return x
    else:
        add = x if y%2 else 0
        return mult2(x*2, y//2) + add


0 commentaires