Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: CaronteGold en 30 Diciembre 2009, 20:12 pm



Título: Calculador de Binomio de Newton [Python]
Publicado por: CaronteGold en 30 Diciembre 2009, 20:12 pm
Buenas,

Pues publico el código para realizar el binomio de newton, tanto con incógnitas como sin ellas, sé que está muy lioso el código, sobran las variables de potencias, ( me guié por Batch en el que para potencias no había x**y) , pero bueno, la cosa es que cumple la función, está puesto para uso ... diría escolar xD, es decir no presenta la solución, si no que la resuelve en los dos pasos.

Lo publico como guía o cualquier cosa, si le sirve a alguien, estaría bien. Si queréis mejorar el código o algo, ahí lo tenéis.

Una cosa, este símbolo ---> ^ , es para potencias, quiere decir elevado, ejemplo: 10^9 , sería 10 elevado a potencia 9.

 
Saludos.

Código
  1. # -*- coding: cp1252 -*-
  2. import math
  3.  
  4. print("Binomio de Newton")
  5.  
  6. # Aqui pido los datos , numeros, potencias y en caso de que haya incognitas tambien
  7. a = input("Primer numero: ")
  8. incoga = raw_input("Incognita (si no hay, poner guion -): ")
  9. b = input("Segundo numero: ")
  10. incogb = raw_input("Incognita (si no hay, poner guion -): ")
  11. pot = input("Potencia: ")
  12. if incoga == "-" and incogb == "-":
  13. print(" \n ("+str(a)+"+"+str(b)+")"+"^"+str(pot))
  14.  
  15. else:
  16. print (" \n ("+str(a)+incoga+"+"+str(b)+incogb+")"+"^"+str(pot))
  17.  
  18. # estas son las variables que hay que usar para el binomio ( los datos del triangulo de Tartaglia o Pascal)
  19.  
  20. cuno = 1
  21. cdos = 5
  22. ctres = 10
  23. ccuatro = 10
  24. ccinco = 5
  25. cseis = 1
  26. cuuno = 1
  27. cudos = 4
  28. cutres = 6
  29. cucuatro = 4
  30. cucinco = 1
  31. seuno = 1
  32. sedos = 6
  33. setres = 15
  34. secuatro = 20
  35. secinco = 15
  36. seseis = 6
  37. sesiete = 1
  38. siuno = 1
  39. sidos = 7
  40. sitres = 21
  41. sicuatro = 35
  42. sicinco = 35
  43. siseis = 21
  44. sisiete = 7
  45. siocho = 1
  46. ocuno = 1
  47. ocdos = 8
  48. octres = 28
  49. occuatro = 56
  50. occinco = 70
  51. ocseis = 56
  52. ocsiete = 28
  53. ococho = 8
  54. ocnueve = 1
  55. nuuno = 1
  56. nudos = 9
  57. nutres = 36
  58. nucuatro = 84
  59. nucinco = 126
  60. nuseis = 126
  61. nusiete = 84
  62. nuocho = 36
  63. nunueve = 9
  64. nudiez = 1
  65.  
  66. # anteriormente lo habia hecho en batch, entonces las potencias las hice en variables, pero seria mejor no hacerlo como yo, es decir para las potencias poner en la operación a**6 (ejemplo).
  67.  
  68. panueve = a**9
  69. paocho = a**8
  70. pasiete = a**7
  71. paseis = a**6
  72. pacinco = a**5
  73. pacuatro = a**4
  74. patres = a**3
  75. pados = a**2
  76.  
  77. pbnueve = b**9
  78. pbocho = b**8
  79. pbsiete = b**7
  80. pbseis = b**6
  81. pbcinco = b**5
  82. pbcuatro = b**4
  83. pbtres = b**3
  84. pbdos = b**2
  85.  
  86. # en caso de que no haya incognitas se ejecutan estos bloques
  87. if incoga == "-" and incogb == "-":
  88.  
  89. if pot == 4:
  90. print " \n " ,cuuno, "*" ,pacuatro, "+" ,cudos, "*" ,patres, "*" ,b, "+" ,cutres, "*" ,pados, "*" ,pbdos, "+" ,cucuatro, "*" ,a, "*" ,pbtres, "+" ,cucinco, "*" ,pbcuatro,
  91. print " \n \n Solucion final:" ,cuuno*pacuatro+cudos*patres*b+cutres*pados*pbdos+cucuatro*a*pbtres+cucinco*pbcuatro
  92.  
  93. if pot == 5:
  94. print " \n " ,cuno, '*' ,pacinco, "+" ,cdos, "*" ,pacuatro, "*" ,b, "+" ,ctres, "*" ,patres, "*" ,pbdos, "+" ,ccuatro, "*" ,pados, "*" ,pbtres, "+" ,ccinco, "*" ,a, "*" ,pbcuatro, "+" ,cseis, "*" ,pbcinco,
  95. print " \n \n Solucion final:" ,cuno*pacinco+cdos*pacuatro*b+ctres*patres*pbdos+ccuatro*pados*pbtres+ccinco*a*pbcuatro+cseis*pbcinco
  96. if pot == 6:
  97. print " \n " ,seuno, "*" ,paseis, "+" ,sedos, "*" ,pacinco, "*" ,b, "+" ,setres, "*" ,pacuatro, "*" ,pbdos, "+" ,secuatro, "*" ,patres, "*" ,pbtres, "+" ,secinco, "*" ,pados, "*" ,pbcuatro, "+" ,seseis, "*" ,a, "*" ,pbcinco, "+" ,sesiete, "*" ,pbseis,
  98. print " \n \n Solucion final:" ,seuno*paseis+sedos*pacinco*b+setres*pacuatro*pbdos+secuatro*patres*pbtres+secinco*pados*pbcuatro+seseis*a*pbcinco+sesiete*pbseis
  99.  
  100. if pot == 7:
  101. print " \n " ,siuno, "*" ,pasiete, "+" ,sidos, "*" ,paseis, "*" ,b, "+" ,sitres, "*" ,pacinco, "*" ,pbdos, "+" ,sicuatro, "*" ,pacuatro, "*" ,pbtres, "+" ,sicinco, "*" ,patres, "*" ,pbcuatro, "+" ,siseis, "*" ,pados, "*" ,pbcinco, "+" ,sisiete, "*" ,a, "*" ,pbseis, "+" ,siocho, "*" ,pbsiete,
  102. print " \n \n Solucion final:" ,siuno*pasiete+sidos*paseis*b+sitres*pacinco*pbdos+sicuatro*pacuatro*pbtres+sicinco*patres*pbcuatro+siseis*pados*pbcinco+sisiete*a*pbseis+siocho*pbsiete
  103.  
  104. if pot == 8:
  105. print " \n " ,ocuno, "*" ,paocho, "+" ,ocdos, "*" ,pasiete, "*" ,b, "+" ,octres, "*" ,paseis, "*" ,pbdos, "+" ,occuatro, "*" ,pacinco, "*" ,pbtres, "+" ,occinco, "*" ,pacuatro, "*" ,pbcuatro, "+" ,ocseis, "*" ,patres, "*" ,pbcinco, "+" ,ocsiete, "*" ,pados, "*" ,pbseis, "+" ,ococho, "*" ,a, "*" ,pbsiete, "+" ,ocnueve, "*" ,pbocho
  106. print " \n \n Solucion final:" ,ocuno*paocho+ocdos*pasiete*b+octres*paseis*pbdos+occuatro*pacinco*pbtres+occinco*pacuatro*pbcuatro+ocseis*patres*pbcinco+ocsiete*pados*pbseis+ococho*a*pbsiete+ocnueve*pbocho
  107.  
  108. if pot == 9:
  109. print " \n " ,nuuno, "*" ,panueve, "+" ,nudos, "*" ,paocho, "*" ,b, "+" ,nutres, "*" ,pasiete, "*" ,pbdos, "+" ,nucuatro, "*" ,paseis, "*" ,pbtres, "+" ,nucinco, "*" ,pacinco, "*" ,pbcuatro, "+" ,nuseis, "*" ,pacuatro, "*" ,pbcinco, "+" ,nusiete, "*" ,patres, "*" ,pbseis, "+" ,nuocho, "*" ,pados, "*" ,pbsiete, "+" ,nunueve, "*" ,a, "*" ,pbocho, "+" ,nudiez, "*" ,pbnueve,
  110. print " \n \n Solucion final:" ,nuuno*panueve+nudos*paocho*b+nutres*pasiete*pbdos+nucuatro*paseis*pbtres+nucinco*pacinco*pbcuatro+nuseis*pacuatro*pbcinco+nusiete*patres*pbseis+nuocho*pados*pbsiete+nunueve*a*pbocho+nudiez*pbnueve
  111.  
  112. # si hay incognitas se ejecuta esto otro
  113. else:
  114.  
  115. if pot ==4:
  116. print " \n " ,cuuno, "*" ,str(pacuatro) + incoga +"^4", "+" ,cudos, "*" ,str(patres) + incoga+"^3", "*" ,str(b) + incogb, "+" ,cutres, "*" ,str(pados) + incoga+"^2", "*" ,str(pbdos) + incogb+"^2", "+" ,cucuatro, "*" ,str(a) + incoga, "*" ,str(pbtres) + incogb+"^3", "+" ,cucinco, "*" ,str(pbcuatro) + incogb+"^4",
  117. print " \n \n Solucion final:" ,str(cuuno*pacuatro) + incoga+"^4","+",str(cudos*patres) + incoga+"^3","*",str(b) + incogb,"+",str(cutres*pados) + incoga+"^2","*",str(pbdos) + incogb+"^2","+",str(cucuatro*a) + incoga,"*",str(pbtres) + incogb+"^3","+",str(cucinco*pbcuatro) + incogb+"^4"
  118. if pot == 5:
  119. print " \n " ,cuno,'*',str(pacinco) + incoga+"^5","+",cdos,"*",str(pacuatro) + incoga+"^4","*",str(b) + incogb,"+",ctres,"*",str(patres) + incoga+"^3","*",str(pbdos) + incogb+"^2","+",ccuatro,"*",str(pados) + incoga+"^2","*",str(pbtres) + incogb+"^3","+",ccinco,"*",str(a) + incoga,"*",str(pbcuatro)+ incogb+"^4","+",cseis,"*",str(pbcinco) + incogb+"^5",
  120. print " \n \n Solucion final:" ,str(cuno*pacinco) + incoga+"^5","+",str(cdos*pacuatro) + incoga+"^4","*",str(b) + incogb,"+",str(ctres*patres) + incoga+"^3","*",str(pbdos)+ incogb+"^2","+",str(ccuatro*pados) + incoga+"^2","*",str(pbtres) + incogb+"^3","+",str(ccinco*a) + incoga,"*",str(pbcuatro) + incogb+"^4","+",str(cseis*pbcinco) + incogb+"^5",
  121.  
  122. if pot == 6:
  123. print " \n " ,seuno,"*",str(paseis) + incoga+"^6","+",sedos,"*",str(pacinco) + incoga+"^5","*",str(b) + incogb,"+",setres,"*",str(pacuatro) + incoga+"^4","*",str(pbdos) + incogb+"^2","+",secuatro,"*",str(patres) + incoga+"^3","*",str(pbtres) + incogb+"^3","+",secinco,"*",str(pados) + incoga+"^2","*",str(pbcuatro) + incogb+"^4","+",seseis,"*",str(a) + incoga,"*",str(pbcinco) + incogb+"^5","+",sesiete,"*",str(pbseis) + incogb+"^6",
  124. print " \n \n Solucion final:" ,str(seuno*paseis) + incoga+"^6","+",str(sedos*pacinco) + incoga+"^5","*",str(b) + incogb,"+",str(setres*pacuatro) + incoga+"^4","*",str(pbdos) + incogb+"^2","+",str(secuatro*patres) + incoga+"^3","*",str(pbtres) + incogb+"^3","+",str(secinco*pados) + incoga+"^2","*",str(pbcuatro) + incogb+"^4","+",str(seseis*a) + incoga,"*",str(pbcinco) + incogb+"^5","+",str(sesiete*pbseis) + incogb+"^6",
  125.  
  126. if pot == 7:
  127. print " \n " ,siuno,"*",str(pasiete) + incoga+"^7","+",sidos,"*",str(paseis) + incoga+"^6","*",str(b) + incogb,"+",sitres,"*",str(pacinco) + incoga+"^5","*",str(pbdos) + incogb+"^2","+",sicuatro,"*",str(pacuatro) + incoga+"^4","*",str(pbtres) + incogb+"^3","+",sicinco,"*",str(patres) + incoga+"^3","*",str(pbcuatro) + incogb+"^4","+",siseis,"*",str(pados) + incoga+"^2","*",str(pbcinco) + incogb+"^5","+",sisiete,"*",str(a) + incoga,"*",str(pbseis) + incogb+"^6", "+" ,siocho, "*" ,str(pbsiete) + incogb+"^7",
  128. print " \n \n Solucion final:" ,str(siuno*pasiete) + incoga+"^7","+",str(sidos*paseis) + incoga+"^6","*",str(b) + incogb,"+",str(sitres*pacinco) + incoga+"^5","*",str(pbdos) +incogb+"^2","+",str(sicuatro*pacuatro) +incoga+"^4","*",str(pbtres) + incogb+"^3","+",str(sicinco*patres) + incoga+"^3","*",str(pbcuatro) + incogb+"^4","+",str(siseis*pados) + incoga+"^2","*",str(pbcinco) + incogb+"^5","+",str(sisiete*a) + incoga,"*",str(pbseis)+ incogb+"^6","+",str(siocho*pbsiete) + incogb +"^7",
  129.  
  130. if pot == 8:
  131. print " \n " ,ocuno,"*",str(paocho) + incoga+"^8","+",ocdos,"*",str(pasiete) + incoga+"^7","*",str(b) + incogb,"+",octres,"*",str(paseis) + incoga+"^6","*",str(pbdos) + incogb+"^2","+",occuatro,"*",str(pacinco) + incoga+"^5","*",str(pbtres) + incogb+"^3","+",occinco,"*",str(pacuatro) + incoga+"^4","*",str(pbcuatro) + incogb+"^4","+",ocseis,"*",str(patres) + incoga+"^3","*",str(pbcinco) + incogb+"^5","+",ocsiete,"*",str(pados) + incoga+"^2","*",str(pbseis) + incogb+"^6","+",ococho,"*",str(a) + incoga,"*",str(pbsiete) + incogb+"^7","+",ocnueve,"*",str(pbocho) + incogb+"^8"
  132. print " \n \n Solucion final:" ,str(ocuno*paocho) + incoga+"^8","+",str(ocdos*pasiete) + incoga+"^7","*",str(b) + incogb,"+",str(octres*paseis) + incoga+"^6","*",str(pbdos) + incogb+"^2","+",str(occuatro*pacinco) + incoga+"^5","*",str(pbtres) + incogb+"^3","+",str(occinco*pacuatro) + incoga+"^4","*",str(pbcuatro) + incogb+"^4","+",str(ocseis*patres) + incoga+"^3","*",str(pbcinco) + incogb+"^5","+",str(ocsiete*pados) + incoga+"^2","*",str(pbseis) + incogb+"^6","+",str(ococho*a) + incoga,"*",str(pbsiete) + incogb+"^7","+",str(ocnueve*pbocho) + incogb+"^8"
  133.  
  134. if pot == 9:
  135. print " \n " ,nuuno,"*",str(panueve) + incoga+"^9","+",nudos,"*",str(paocho) + incoga+"^8","*",str(b) + incogb,"+",nutres,"*",str(pasiete) + incoga+"^7","*",str(pbdos) + incogb+"^2","+",nucuatro,"*",str(paseis) + incoga+"^6","*",str(pbtres) + incogb+"^3","+",nucinco,"*",str(pacinco) + incoga+"^5","*",str(pbcuatro) + incogb+"^4","+",nuseis,"*",str(pacuatro) + incoga+"^4","*",str(pbcinco) + incogb+"^5","+",nusiete,"*",str(patres) + incoga+"^3","*",str(pbseis) + incogb+"^6","+",nuocho,"*",str(pados) + incoga+"^2","*",str(pbsiete) + incogb+"^7","+",nunueve,"*",str(a) + incoga,"*",str(pbocho) + incogb+"^8","+",nudiez,"*",str(pbnueve) + incogb+"^9",
  136. print " \n \n Solucion final:" ,str(nuuno*panueve) + incoga+"^9","+",str(nudos*paocho) + incoga+"^8","*",str(b) + incogb,"+",str(nutres*pasiete) + incoga+"^7","*",str(pbdos) + incogb+"^2","+",str(nucuatro*paseis) + incoga+"^6","*",str(pbtres) + incogb+"^3","+",str(nucinco*pacinco) + incoga+"^5","*",str(pbcuatro) + incogb+"^4","+",str(nuseis*pacuatro) + incoga+"^4","*",str(pbcinco) + incogb+"^5","+",str(nusiete*patres) + incoga+"^3","*",str(pbseis) + incogb+"^6","+",str(nuocho*pados) + incoga+"^2","*",str(pbsiete) + incogb+"^7","+",str(nunueve*a) + incoga,"*",str(pbocho) + incogb+"^8","+",str(nudiez*pbnueve) + incogb+"^9"
  137.  
  138. raw_input()


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: Novlucker en 30 Diciembre 2009, 20:20 pm
Bueno, como te había comentado por privado, el código es muy pero muy mejorable ya que tienes muchas cosas hechas a "mano", como la lógica de las fórmulas para las diferentes potencias, así que en cuanto tenga tiempo cuelgo otro code :P , no obstante, sigue adelante ;)

Saludos

P.d: usuario de python 3.x, si vas a probar el script necesita ligeras modificaciones, funciona ok en la versión 2.6


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: Masita en 31 Diciembre 2009, 03:01 am
Es una tonteria pero ese codigo no funcionaria. Se te ha olvidado tabular despues de cada "if" es algo que hay que tener muy en cuenta en python.  ;)

Bueno te dejo un poco de codigo con otra forma de hacerlo

Código
  1. a = int(raw_input("ingresa el primer numero:  "))
  2. b = int(raw_input("ingresa el segundo numero:  "))
  3. n = int(raw_input("ingresa el exponente:  "))
  4. x = (a+b)**n
  5.  
  6. if n == 1:
  7. print a,"+",b
  8. print x
  9. if n == 2:
  10. print "%d^2 + 2*%d*%d + %d^2" % (a,a,b,b)
  11. print x
  12. if n == 3:
  13. print "%d^3 + 3*%d^2*%d + 3*%d*%d^2 + %d^3" % (a,a,b,a,b,b)
  14. print x
  15.  
Bueno y luego seguiria con 4,5,6...... pero es tarde y me voy a la cama, supongo que habra alguna manera con bucles de hacerlo aun mas sencillo...

Saludos y feliz python!


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: Novlucker en 31 Diciembre 2009, 05:18 am
Lo de las tabulaciones, "mea culpa", el código estaba algo desordenado y cuando lo "arreglé" desaparecieron, desde hace un tiempo ocurre con firefox que por alguna razón las tabulaciones desaparecen al publicar con código geshi :¬¬

Es una tonteria pero ese codigo no funcionaria.

¿Por que es una tontería? O te refieres a que el error es una tontería?


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: Masita en 31 Diciembre 2009, 05:20 am
Con lo de tonteria me referia a que es un fallo simple lo de dejarte una tabulacion, pero si lo haces nada va a funcionar.


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: Novlucker en 31 Diciembre 2009, 05:35 am
Bueno, lo prometido es deuda CaronteGold, y como no me gusta deber a nadie :P ...

Código
  1. def Ttartaglia(levels):
  2. aTar = [[1],[1,1]]
  3. for i in range(2,levels):
  4. aux = []
  5. for e in range(1,i):
  6. aux.append(aTar[i-1][e-1]+aTar[i-1][e])
  7. aux = [1]+aux+[1]
  8. aTar.append(aux)
  9. return aTar
  10.  
  11. print("(a + b)^n")
  12. a = int(input("Ingrese el primer valor, 'a': "),10)
  13. b = int(input("Ingrese el segundo valor, 'b': "),10)
  14. n = int(input("Ingrese potencia , 'n': "),10)
  15. aux1 = 0
  16.  
  17. Resv = 0
  18. form = ''
  19.  
  20. for v in Ttartaglia(n+1)[n]:
  21. form += str(v)+"*"+str(a)+"^"+str(n-aux1)+"*"+str(b)+"^"+str(aux1)+" + "
  22. Resv += v*(a**(n-aux1))*(b**aux1)
  23. aux1 += 1
  24.  
  25. print("\nLa fórmula aplicada es la siguiente:\n"+form[:-3])
  26. print("\nEl resultado es: "+str(Resv))

Lo he hecho directamente para fórmulas sin incógnitas.
Le he agregado una función que devuelve una lista conteniendo el triángulo de Tartaglia, a la cual hay que pasarle el número de filas que se quiere que tenga la lista (cuenta la cero)
Mejorando lo del triángulo es más sencillo tener un algorítmo claro y limpio, así que la suma y fórmulas finales también se pueden generar, y no van a mano como antes
Sería bueno que tuviese verificación de errores (ingreso de usuario), pero creo que con esto basta para darte ideas ;)

La salida:
Código:
(a + b)^n
Ingrese el primer valor, 'a': 5
Ingrese el segundo valor, 'b': 8
Ingrese potencia , 'n': 6

La fórmula aplicada es la siguiente:
1*5^6*8^0 + 6*5^5*8^1 + 15*5^4*8^2 + 20*5^3*8^3 + 15*5^2*8^4 + 6*5^1*8^5 + 1*5^0*8^6

El resultado es: 4826809
>>>

Prestame atención, sigue con lo básico, entiende bien los bucles y condicionales, luego te pasas a objetos (sockets por ejemplo)

Saludos ::)


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: CaronteGold en 31 Diciembre 2009, 17:40 pm
    Ahora miraré " def  y return, ", y el for, porque aún no lo he visto y no puedo entender bien el código xD.

   El código está hecho para Python 3.x ? no ¿? , es que lo miré en la 2.6 y me da error al ingresar un número en "a".
 
   Saludos.


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: Novlucker en 31 Diciembre 2009, 20:10 pm
Sumale a eso, mirar las listas

Exacto, Python 3.1, solo cambiale los input para el ingreso :P

Saludos


Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: CaronteGold en 1 Enero 2010, 04:31 am
Sumale a eso, mirar las listas

Exacto, Python 3.1, solo cambiale los input para el ingreso :P

Saludos

    Listas las he mirado, no es que lo maneje bien, pero si las identifiqué en tu programa.



Título: Re: Calculador de Binomio de Newton [Python]
Publicado por: werty2310 en 17 Febrero 2022, 20:46 pm
a = int(input("ingresa el primer numero: \n"))
b = int(input("ingresa el segundo numero: \n"))
n = int(input("ingresa el exponente: \n"))
x = (a+b)**n
 
if n == 1:
   print(a,"+",b)
   print(x)
if n == 2:
   print("%d^2 + 2*%d*%d + %d^2" % (a,a,b,b))
   print (x)
if n == 3:
   print("%d^3 + 3*%d^2*%d + 3*%d*%d^2 + %d^3" % (a,a,b,a,b,b))
   print(x)