web-dev-qa-db-fra.com

travailler avec des nombres négatifs en python

Je suis un étudiant dans les concepts de la classe de programmation. Le laboratoire est dirigé par un assistant technique et, aujourd'hui, il nous a confié un véritable petit programme simple à mettre en place. C'était un cas où il se multiplierait par addition. Quoi qu'il en soit, il nous a fait utiliser Absolu pour éviter de casser le prog avec des négatifs. Je l'ai rapidement corrigée puis j'ai argumenté pendant 10 minutes avec lui pour dire 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 souciait vraiment pas de ça et qu'il serait trop difficile de laisser le prog gérer les négatifs de toute façon. Donc, ma question est comment puis-je aller à ce sujet.

voici le prog que j'ai rendu:

#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 absolus, mais chaque fois que je saisis des nombres négatifs, je reçois une grosse graisse d'oie. Je sais qu'il existe un moyen simple de le faire, je ne le trouve pas. 

10
dman762000

Peut-être que vous y arriveriez avec quelque chose qui aurait pour 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
5
Mike Graham

Trop dur? Votre TA est ... eh bien, cette phrase me ferait probablement interdire. Quoi qu'il en soit, vérifiez si numb est négatif. Si c'est le cas, multipliez numa par -1 et faites numb = abs(numb). Alors faites la boucle.

3

La condition abs () dans la condition while est nécessaire car elle contrôle le nombre d'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.

Donc, ceci est la version modifiée de votre code. Notez que j'ai remplacé la boucle while par un nettoyeur pour la 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
3
slacker

Essayez ceci 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
1
John Machin

Merci à tous, vous m'avez tous beaucoup aidé à apprendre. C’est ce que j’ai proposé d’utiliser 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 à tous pour votre aide.

0
dman762000

Que diriez-vous de quelque chose comme ça? (N'utilise pas d'abs () ni de multiplication)
Remarques:

  • la fonction abs () n'est utilisée que pour l'astuce d'optimisation. Cet extrait peut être supprimé ou recodé.
  • la logique est moins efficace puisque nous testons les signes de a et de b à chaque itération (prix à payer pour éviter à la fois l'opérateur abs () et l'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
mjv