2010-03-16 14 views
8

Je suis un étudiant en concepts de classe de programmation. Le laboratoire est dirigé par un AT et aujourd'hui, il nous a donné un petit programme très simple à construire. C'était un où il se multiplierait par addition. De toute façon, il nous a fait utiliser absolu pour éviter de casser le prog avec des négatifs. Je l'ai fouetté très rapidement et j'ai discuté avec lui pendant 10 minutes que c'était un mauvais calcul. Il était, 4 * -5 n'est pas égal à 20, il est égal à -20. Il a dit qu'il ne se soucie pas vraiment de ça et qu'il serait trop difficile de faire en sorte que le prog gère les négatifs de toute façon. Alors ma question est de savoir comment je vais faire à ce sujet.travailler avec des nombres négatifs en python

ici est le prog je me suis tourné dans:

#get user input of numbers as variables 

numa, numb = input("please give 2 numbers to multiply seperated with a comma:") 

#standing variables 
total = 0 
count = 0 

#output the total 
while (count< abs(numb)): 
    total = total + numa 
    count = count + 1 

#testing statements 
if (numa, numb <= 0): 
    print abs(total) 
else: 
    print total 

Je veux le faire sans l'absolu, mais chaque fois que les nombres négatifs d'entrée I je reçois un grand goosegg de graisse. Je sais qu'il y a un moyen simple de le faire, je ne peux pas le trouver.

+0

Préférez toujours '' raw_input' à input', qui ne devrait pas être dans la langue (et est supprimé en Python 3.) –

+0

Et pour compliquer les choses, 'input' en Python 3 est le même que 'raw_input' dans Python 2, et IIRC, Python 3 n'a pas' raw_input'. @ _ @ –

+0

C'est vrai, 'raw_input' est renommé' input' dans Python 3. –

Répondre

4

Peut-être vous arriver quelque chose à l'effet de

text = raw_input("please give 2 numbers to multiply separated with a comma:") 
split_text = text.split(',') 
a = int(split_text[0]) 
b = int(split_text[1]) 
# The last three lines could be written: a, b = map(int, text.split(',')) 
# but you may find the code I used a bit easier to understand for now. 

if b > 0: 
    num_times = b 
else: 
    num_times = -b 

total = 0 
# While loops with counters basically should not be used, so I replaced the loop 
# with a for loop. Using a while loop at all is rare. 
for i in xrange(num_times): 
    total += a 
    # We do this a times, giving us total == a * abs(b) 

if b < 0: 
    # If b is negative, adjust the total to reflect this. 
    total = -total 

print total 

ou peut-être

a * b 
+2

RTQ: multiplication par addition –

3

Trop dur? Votre TA est ... eh bien, l'expression me ferait probablement bannir. Quoi qu'il en soit, vérifiez si numb est négatif. Si c'est alors multiplier numa par -1 et faire numb = abs(numb). Puis faites la boucle.

+0

Ummm tout le projet est sur la multiplication; Devrait-il implémenter la multiplication par -1 par récursion? Peut-être que la récursivité et les piles sont trop difficiles pour le TA :-) –

+0

@John: Nah. Il suffit de le soustraire de 0. –

3

L'ABS() dans la condition while est nécessaire, étant donné que, eh bien, il contrôle le nombre des itérations (comment définiriez-vous un nombre négatif d'itérations?). Vous pouvez le corriger en inversant le signe du résultat si numb est négatif.

Il s'agit donc de la version modifiée de votre code. Note J'ai remplacé la boucle while par un nettoyeur pour boucle.

#get user input of numbers as variables 
numa, numb = input("please give 2 numbers to multiply seperated with a comma:") 

#standing variables 
total = 0 

#output the total 
for count in range(abs(numb)): 
    total += numa 

if numb < 0: 
    total = -total 

print total 
0

Que diriez-vous quelque chose comme ça? (Utilise pas abs() ni mulitiplication)
Notes:

  • la fonction abs() est utilisée uniquement pour l'astuce d'optimisation. Cet extrait peut être supprimé ou recodé.
  • la logique est moins efficace puisque nous testons le signe de a et b à chaque itération (prix à payer pour éviter à la fois abs() et opérateur de multiplication)

def multiply_by_addition(a, b): 
""" School exercise: multiplies integers a and b, by successive additions. 
""" 
    if abs(a) > abs(b): 
     a, b = b, a  # optimize by reducing number of iterations 
    total = 0 
    while a != 0: 
     if a > 0: 
     a -= 1 
     total += b 
     else: 
     a += 1 
     total -= b 
    return total 

multiply_by_addition(2,3) 
6 
multiply_by_addition(4,3) 
12 
multiply_by_addition(-4,3) 
-12 
multiply_by_addition(4,-3) 
-12 
multiply_by_addition(-4,-3) 
12 
+0

Vous devez placer la boucle 'while' dans l'instruction' if', puisque l'instruction 'if' évalue la même chose à chaque fois. Ou définissez une variable 'da' à' 1' ou '-1', et' dt' à 'total' ou' -total', avant la boucle while. –

+0

Les fonctions en Python doivent commencer par une lettre minuscule. Si quelqu'un voit 'FooBar' (en dehors d'une bibliothèque externe avec une telle convention de nommage), ils penseront que c'est une classe. –

+0

@Mike, oui! Vous avez raison, ce serait généralement préférable. Dans le cadre de cette affectation _contrived_, j'ai opté pour une approche unique, car elle reflétait l'algorithme original et rendait les mathématiques plus autonomes. Bien que faire tous nos "tests de signes" à l'avance et avoir 2 (ou 3 ou 4) boucles tout au contraire serait équivalent, le single lit plus comme un seul algorithme (psychologique, sans doute). – mjv

1

Essayez cette sur votre tA:

# Simulate multiplying two N-bit two's-complement numbers 
# into a 2N-bit accumulator 
# Use shift-add so that it's O(base_2_log(N)) not O(N) 

for numa, numb in ((3, 5), (-3, 5), (3, -5), (-3, -5), (-127, -127)): 
    print numa, numb, 
    accum = 0 
    negate = False 
    if numa < 0: 
     negate = True 
     numa = -numa 
    while numa: 
     if numa & 1: 
      accum += numb 
     numa >>= 1 
     numb <<= 1 
    if negate: 
     accum = -accum 
    print accum 

sortie:

3 5 15 
-3 5 -15 
3 -5 -15 
-3 -5 15 
-127 -127 16129 
+0

Techniquement, les inversions de signe ('accum = -accum' et similaires) ainsi que les opérations de changements (' engourdi << = 1') sont des multiplications mais + rien de moins pour une idée géniale, et des concepts qui rentrent probablement dans les choses typiques que l'OP a ou va bientôt couvrir en classe: – mjv

+0

@mjv: C'est ce qu'on appelle la négation, pas l'inversion de signe ... si la boîte simulée n'a pas d'instruction NEG, faites-la par soustraction à partir de 0. En utilisant votre raisonnement, le 'abs()' saupoudré sur d'autres réponses est également une multiplication !! Si le décalage est une multiplication, alors Shift est une opération matérielle très primitive et est utilisée dans la mise en œuvre de la multiplication –

+0

Vous avez raison, à tous les niveaux, et en effet, une fois que vous regardez le niveau de la CPU, cet exercice soit vient vraiment gênant de le dire poliment. Heureux que nous puissions aider le PO, je déteste quand les instructeurs semblent décourager les étudiants d'aller plus loin ... – mjv

0

Merci à tous, vous m'avez tous aidé à apprendre beaucoup. C'est ce que j'ai trouvé en utilisant certaines de vos suggestions

#this is apparently a better way of getting multiple inputs at the same time than the 
#way I was doing it 
text = raw_input("please give 2 numbers to multiply separated with a comma:") 
split_text = text.split(',') 
numa = int(split_text[0]) 
numb = int(split_text[1]) 

#standing variables 
total = 0 

if numb > 0: 
    repeat = numb 
else: 
    repeat = -numb 

#for loops work better than while loops and are cheaper 
#output the total 
for count in range(repeat): 
    total += numa 


#check to make sure the output is accurate 
if numb < 0: 
    total = -total 


print total 

Merci pour toute l'aide à tous.

+0

Quel est le point de la clause if-else, si tout ce qu'il fait est un simple 'repeat = abs (engourdi) '? – slacker

+0

Aussi, si votre problème est résolu, alors s'il vous plaît accepter l'une des réponses (peut-être même la vôtre). – slacker

+0

sans la clause if else les nombres retournent toujours avec la valeur absolue, pas la vraie valeur donc sans elle le prog retourne encore 4 * -5 comme 20 au lieu de -20 – dman762000

-1
import time 

print ('Two Digit Multiplication Calculator') 
print ('===================================') 
print() 
print ('Give me two numbers.') 

x = int (input (':')) 

y = int (input (':')) 

z = 0 

print() 


while x > 0: 
    print (':',z) 
    x = x - 1 
    z = y + z 
    time.sleep (.2) 
    if x == 0: 
     print ('Final answer: ',z) 

while x < 0: 
    print (':',-(z)) 
    x = x + 1 
    z = y + z 
    time.sleep (.2) 
    if x == 0: 
     print ('Final answer: ',-(z)) 

print() 
+1

seules les réponses au code ne fonctionnent généralement pas bien, pouvez-vous expliquer? –

Questions connexes