2010-03-16 21 views
8

Soy un estudiante en conceptos de clase de programación. El laboratorio está dirigido por un asistente técnico y hoy, en el laboratorio, nos dio un pequeño programa realmente simple para construir. Era uno donde se multiplicaría por adición. De todos modos, nos hizo usar absoluto para evitar romper el prog con negativos. Lo preparé rápidamente y luego discutí con él durante 10 minutos que era una mala matemática. Era, 4 * -5 no es igual a 20, es igual a -20. Dijo que realmente no le importaba eso y que sería demasiado difícil hacer que el programa manejara los negativos de todos modos. Entonces mi pregunta es ¿cómo hago esto?trabajando con números negativos en python

aquí es el prog di vuelta en:

#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 

quiero hacerlo sin absolutos, pero cada vez que los números negativos de entrada me puedo obtener una gran goosegg grasa. Sé que hay una forma simple de hacerlo, simplemente no puedo encontrarlo.

+0

preferir siempre '' raw_input' a input', que no debe estar en el idioma (y se elimina en Python 3.) –

+0

Y sólo para confundir las cosas, 'input' en Python 3 es el mismo que 'raw_input' en Python 2, y IIRC, Python 3 no tiene' raw_input'. @ _ @ –

+0

Correcto, 'raw_input' se renombra como' input' en Python 3. –

Respuesta

4

Tal vez usted lograr esto con algo en el sentido 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 

o tal vez

a * b 
+2

RTQ: multiplicación por la suma –

3

¿Demasiado difícil? Tu TA es ... bueno, la frase probablemente me prohibiría. De todos modos, verifique si numb es negativo. Si es así, multiplique numa por -1 y haga numb = abs(numb). Luego haz el ciclo.

+0

Ummm todo el proyecto trata sobre la multiplicación; ¿Debería implementar la multiplicación por -1 por recursión? Tal vez la recursividad y los stacks son demasiado difíciles para el TA :-) –

+0

@John: Nah. Basta con restarlo 0. –

3

El abs() en el estado, mientras que se necesita, ya que, así, se controla el número de iteraciones (¿cómo definirías un número negativo de iteraciones?). Puede corregirlo invirtiendo el signo del resultado si numb es negativo.

Así que esta es la versión modificada de su código. Nota: Reemplacé el ciclo while con un limpiador para loop.

#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

¿Qué tal algo así? (No usa abs() ni mulitiplication)
Notas:

  • la función abs() sólo se utiliza para el truco de optimización. Este fragmento puede ser eliminado o recodificado.
  • la lógica es menos eficiente ya que estamos probando el signo de a y b con cada iteración (precio a pagar para evitar ambos abs() y operador de multiplicación)

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

Debería poner el bucle 'while' dentro de la instrucción' if', ya que la instrucción 'if' evalúa la misma cada vez. O establezca una variable 'da' en' 1' o '-1', y' dt' en 'total' o' -total', antes del ciclo while. –

+0

Las funciones en Python deben comenzar con una letra minúscula. Si alguien ve 'FooBar' (fuera de una biblioteca externa con una convención de nomenclatura), pensarán que es una clase. –

+0

@Mike, sí! Tienes razón, esto normalmente sería preferible. En el contexto de esta asignación _contrived_, opté por un único enfoque while, porque refleja el algoritmo original y hace que las matemáticas sean más autónomas. Aunque hacer todas nuestras "pruebas de signos" de antemano y tener 2 (o 3 o 4) mientras bucles en su lugar sería equivalente, el único mientras se lee más como un algoritmo único (psicológico, sin duda). – mjv

1

probar este en su 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 

de salida:

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

Técnicamente, las inversiones de signo ('accum = -accum' y similares), así como las operaciones de turnos (' entumecimiento << = 1') son multiplicaciones, pero +1, no obstante, para una gran idea, y conceptos que probablemente encajen en las cosas típicas que el OP tiene o cubrirá pronto en clase. – mjv

+0

@mjv: Se llama negación, no inversión de señal ... si la caja que se simula no tiene una instrucción NEG, hazlo restando de cero. Usando tu razonamiento, el 'abs()' salpicado por todas las otras respuestas también es multiplicación. Si el cambio es multiplicación, entonces también lo es la suma, por ejemplo, 'numa + = numa' !!! El desplazamiento es una operación de hardware muy primitiva y se usa en la implementación de la multiplicación. –

+0

En verdad, sí lo eres. Y, de hecho, una vez que miras el nivel de la CPU, este ejercicio sea resulta realmente incómodo decirlo educadamente. Me alegro de que pudiéramos ayudar al OP, lo odio cuando los instructores parecen desalentar a los estudiantes a hacer un esfuerzo adicional ... – mjv

0

Gracias a todos, todos me ayudaron a aprender mucho. Esto es lo que se me ocurrió usar algunas de sus sugerencias

#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 

Gracias por ayudar a todos.

+0

¿Cuál es el punto de toda la cláusula if-else, si todo lo que hace es un simple 'repeat = abs (entumecido) ¿? – slacker

+0

Además, si su problema está resuelto, entonces acepte una de las respuestas (tal vez incluso la suya). – slacker

+0

sin la cláusula if else los números aún regresan con el valor absoluto, no el valor verdadero así que sin él el prog aún devuelve 4 * -5 como 20 en lugar 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

las respuestas con solo el código normalmente no funcionan bien, ¿puedes explicarlo? –

Cuestiones relacionadas