Question

Je suis étudiant dans un concept de classe de programmation. Le laboratoire est géré par un TA et aujourd'hui en laboratoire, il nous a donné un vrai petit programme simple à construire. C'était celui où il se multipliait par addition. Quoi qu'il en soit, il nous a fait utiliser Absolute pour éviter de briser le prog avec des négatifs. Je l'ai fouetté très rapidement, puis je me suis disputé avec lui pendant 10 minutes que c'était de mauvais maths. Il était, 4 * -5 ne équivaut pas à 20, il est égal à -20. Il a dit qu'il ne s'en souciait vraiment pas et qu'il serait trop difficile de faire en sorte que le prog gère les négatifs de toute façon. Donc ma question est de savoir comment puis-je y aller.

Voici le prog-mon avancé:

#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 les nombres négatifs, je reçois un gros gras Goosegg. Je sais qu'il existe un moyen simple de le faire, je ne le trouve pas.

Était-ce utile?

La solution

Peut-être que vous accomplisseriez cela avec 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

Autres conseils

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

L'abs () dans la condition While est nécessaire, car, eh bien, il contrôle le nombre d'itérations (comment définissez-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. Remarque J'ai remplacé la boucle while par un nettoyant 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

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

production:

3 5 15
-3 5 -15
3 -5 -15
-3 -5 15
-127 -127 16129

Et quelque chose comme ça? (N'utilise pas d'abs () ni de mulitiplication)
Remarques:

  • La fonction ABS () n'est utilisée que pour l'astuce d'optimisation. Cet extrait peut être retiré ou recodé.
  • La logique est moins efficace car nous testons le signe de A et B à chaque itération (prix à payer pour éviter à la fois 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

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.

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 ()  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top