elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Teorema Binomial
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Teorema Binomial  (Leído 5,124 veces)
Black Lotus

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Teorema Binomial
« en: 18 Abril 2013, 03:02 am »

Tengo un proyecto que hacer el cual es el teorema de un binomio. El programa consiste en resolver cualquier binomio no importando la potencia...

El problema es el siguiente:
Para resolver (a+b)^3 se resuelve de la siguiente forma a^3 + 3a^2·b + 3·a·b^2+ b^3

Con el codigo que tengo cuando impreme solo el resultado impreme los coeficientes numericos y los terminos del segundo termino con su exponente pero el primer termino solo escribe el literal pero falta a su exponente. Si no me doy a entender el resultado que me saca el programa es el siguiente: a^ + 3b^1a^+3b^2a^+b^3

El codigo es el siguiente:
Código
  1. #include <iostream>
  2. #include <math>
  3. #include <conio>
  4.  
  5.  
  6.  
  7. long int fact(long int x)
  8. {
  9.    int z = 1;
  10.    for (x; x >=1; x--)
  11.    {
  12.        z = z*x;
  13.    }
  14.    return z;
  15. }
  16.  
  17. int main()
  18. {
  19.    long int n, p, num , y;
  20.    char a,b;
  21.    cout << "escriba el exponente de la ecuacion = ";
  22.    cin >> n;
  23.    cout << "escribir el primer termino = ";
  24.    cin >>a ;
  25.    cout << "escribir el primer termino = ";
  26.    cin >>b ;
  27.  
  28.    for (p=1; p<=n; p++)
  29.    {
  30.        y = n - p;
  31.        num = fact(n) / (fact(p) * fact(y));
  32.        cout << a << "^" << " +" << num << b <<"^" << p ;
  33.  
  34.    }
  35.    getch();
  36.  
  37. }
  38.  



En línea

flony


Desconectado Desconectado

Mensajes: 584



Ver Perfil
Re: Teorema Binomial
« Respuesta #1 en: 18 Abril 2013, 03:32 am »

digo...si declaras una variable char a y b, sin inicializar tengo entendido es para solo un caracter..si uno pone 10? ...
por otro lado veo que usas la biblioteca math ...no es mas fácil  usar pow(es para trabajar con potencias )


En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Teorema Binomial
« Respuesta #2 en: 18 Abril 2013, 04:43 am »

Supongo que es algo como esto lo que pretendes:


Código
  1. escriba el exponente de la ecuacion = 4
  2. escribir el primer termino = a
  3. escribir el segundo termino = b
  4. 1 a^ 4 + 4 a^ 3 * b^ 1 + 6 a^ 2 * b^ 2 + 4 a^ 1 * b^ 3 + 1 b^ 4
  5.  

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. long int fact(long int x)
  5. {
  6.    int z = 1;
  7.    for (x; x >=1; x--)
  8.    {
  9.        z = z*x;
  10.    }
  11.    return z;
  12. }
  13.  
  14. int main()
  15. {
  16.    long int n, p, num , y;
  17.    char a,b;
  18.    cout << "escriba el exponente de la ecuacion = ";
  19.    cin >> n;
  20.    cout << "escribir el primer termino = ";
  21.    cin >>a ;
  22.    cout << "escribir el segundo termino = ";
  23.    cin >>b ;
  24.  
  25.    for (p=0; p<=n; p++)
  26.    {
  27.        y = n - p;
  28.        num = fact(n) / (fact(p) * fact(y));
  29.        if (p==0 )
  30.            cout<< num <<" " << a << "^ " << n<< " + " ;
  31.        else if ( p==n)
  32.            cout << num <<" "<< b <<"^ " << p ;
  33.       else {
  34.  
  35.        cout << num <<" "<< a << "^ " << y << " * " << b <<"^ " << p <<" + " ;
  36.       }
  37.  
  38.    }
  39.  
  40.   return 0;
  41. }
  42.  

Saluditos!. ...
« Última modificación: 18 Abril 2013, 04:53 am por leosansan » En línea

Black Lotus

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Teorema Binomial
« Respuesta #3 en: 18 Abril 2013, 17:27 pm »

Supongo que es algo como esto lo que pretendes:


Código
  1. escriba el exponente de la ecuacion = 4
  2. escribir el primer termino = a
  3. escribir el segundo termino = b
  4. 1 a^ 4 + 4 a^ 3 * b^ 1 + 6 a^ 2 * b^ 2 + 4 a^ 1 * b^ 3 + 1 b^ 4
  5.  

Saluditos!. ...

Si es así como lo quería exactamente gracias   ;-) ;-) ;-) ;-) ;-)

Ahora una duda: Porque solo me deja ingresar a la potencia 13.. Si pongo la potencia 14-15 en adelante me salen signos positivos y negativos y no debe ser así:
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Teorema Binomial
« Respuesta #4 en: 18 Abril 2013, 19:44 pm »

Si es así como lo quería exactamente gracias   ;-) ;-) ;-) ;-) ;-)

Ahora una duda: Porque solo me deja ingresar a la potencia 13.. Si pongo la potencia 14-15 en adelante me salen signos positivos y negativos y no debe ser así:


Eso es porque los factoriales toman valores demasiados elevados para C/C++. No es un lenguaje que maneje números enteros de muchas cifras. Eso se resuelve calculando los números combinatorios sin usar los factoriales.

Saluditos!. ...
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Teorema Binomial
« Respuesta #5 en: 18 Abril 2013, 21:42 pm »

PD;Como te comentaba, el uso de los factoriales para el cálculo de los números combinatorios tiene el inconveniente de su tamaño, desbordan las posibilidades de C/C++ desde 14 o 15.

Para evitarlo existe otra forma de calcular los números combinatorios que técnicamente consiste en dividir las variaciones de n tomados de p en p entre las permutaciones de p. Vamos que con un ejemplo se ve que es más fácil de lo que parece:

Combinaciones(15,4)= 15/4 * 14/3 * 13/2 * 12/1.

Y aún así se puede mejorar la eficiencia del cálculo. Por ejemplo:

Combinaciones(15,12)=15/12*14/11*13/10*12/9*11/8*10/7*.....

Muy largo, ¿verdad?. Pero eso se puede remediar aprovechado una propiedad de los números combinatorios que establece que :

Combinaciones(n,p)=Combinaciones(n,n-p)

Y aplicada al caso último daría:

Combinaciones(15,12)=Combinaciones(15,3)=15/3 *14/2 *13/1

Mucho más breve que el anterior método.

Así, aprovechando estas dos propiedades, la primera para cuando es inferior a la mitad de n y la segunda para cuando es superior surge el código mágico que te permitirá "meter" de exponente 20 y más sin problemas de que el C/C++ "cruja" soltando números "raros" porque se salen de sus capacidades:


Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. float comb(int n,int p)
  7. {
  8.    int i;
  9.    if (n < 0 || p < 0 || p > n) return 0;
  10.    float c = 1;
  11.    if (p>n/2)
  12.        p=n-p;
  13.    for ( p; p>=1; p--,n--)
  14.    c*= n/p;
  15.    return c;
  16. }
  17. int main()
  18. {
  19.    long int n, p, num , y;
  20.    char a,b;
  21.    cout << "escriba el exponente de la ecuacion = ";
  22.    cin >> n;
  23.    cout << "escribir el primer termino = ";
  24.    cin >>a ;
  25.    cout << "escribir el segundo termino = ";
  26.    cin >>b ;
  27.  
  28.    for (p=0; p<=n; p++)
  29.    {
  30.        num = comb(n,p);
  31.        y=n-p;
  32.        if (p==0 )
  33.            cout<< num <<" " << a << "^ " << n<< " + " ;
  34.        else if ( p==n)
  35.            cout << num <<" "<< b <<"^ " << p ;
  36.       else {
  37.  
  38.        cout << num <<" "<< a << "^ " << y << " * " << b <<"^ " << p <<" + " ;
  39.       }
  40.  
  41.    }
  42.    return 0;
  43. }
  44.  

He aquí la salida para exponente 20:

Código
  1. escriba el exponente de la ecuacion = 20
  2. escribir el primer termino = a
  3. escribir el segundo termino = b
  4. 1 a^ 20 + 20 a^ 19 * b^ 1 + 190 a^ 18 * b^ 2 + 972 a^ 17 * b^ 3 + 4590 a^ 16 * b^
  5. 4 + 12288 a^ 15 * b^ 5 + 21600 a^ 14 * b^ 6 + 35280 a^ 13 * b^ 7 + 65520 a^ 12 *
  6. b^ 8 + 41472 a^ 11 * b^ 9 + 76032 a^ 10 * b^ 10 + 41472 a^ 9 * b^ 11 + 65520 a^
  7. 8 * b^ 12 + 35280 a^ 7 * b^ 13 + 21600 a^ 6 * b^ 14 + 12288 a^ 5 * b^ 15 + 4590 a
  8. ^ 4 * b^ 16 + 972 a^ 3 * b^ 17 + 190 a^ 2 * b^ 18 + 20 a^ 1 * b^ 19 + 1 b^ 20
  9.  

Y ya que estamos en el tema de los combinatorios surge la cuestión del triángulos de Pascal o Tartaglia que da los números combinatorios de una forma aún más directa, teniendo en cuenta que los extremos del triángulo son unos y los números interiores son la suma de los dos superiores. Como se observa, en este método no se hacen multiplicaciones ni divisiones, sólo sumas por lo que resulta ser más eficiente que el ya eficiente anterior. Una muestra del triángulo de Pascal para 20, 19 en realidad ya que se empieza contando desde cero es la siguiente, aunque para verlo en todo su esplendor deberían ir al icono izquierdo de la consola, picar en propiedades, elegir  diseño y poner en el ancho 150 y verán esto:


REEDITO: Lo pongo sólo de 12 porque en la página web no "cabe" más grande:


Código
  1.  
  2.                                       1
  3.                                   1     1
  4.                                1     2     1
  5.                             1     3     3     1
  6.                          1     4     6     4     1
  7.                       1     5     8     8     5     1
  8.                    1     6    15    16    15     6     1
  9.                 1     7    18    30    30    18     7     1
  10.              1     8    28    36    60    36    28     8     1
  11.           1     9    32    84    72    72    84    32     9     1
  12.        1    10    45    96   168   144   168    96    45    10     1
  13.     1    11    50   135   192   336   336   192   135    50    11     1
  14.  


¡ Lástima !que no "quepa" el de 20.


Saluditos! ... y perdón por el retraso en la respuesta, pero estoy liado con "otras cosas". ....

P.D.P.D: Sorry nuevamente por no haber editado en el anterior mensaje, si alguien puede que los "pegue". >:D
« Última modificación: 19 Abril 2013, 02:11 am por leosansan » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] Teorema de Pitágoras « 1 2 3 »
Programación C/C++
STANHMAL 22 20,942 Último mensaje 8 Julio 2010, 02:35 am
por .:BlackCoder:.
[Código] Teorema de Pítagoras [Python]
Scripting
@Sthéfano 0 6,004 Último mensaje 26 Julio 2010, 22:34 pm
por @Sthéfano
[Python] Coeficiente Binomial.
Scripting
[L]ord [R]NA 0 6,041 Último mensaje 6 Septiembre 2010, 16:37 pm
por [L]ord [R]NA
Teorema del seno
Programación C/C++
ChicoMaravilla 3 3,436 Último mensaje 10 Noviembre 2011, 13:55 pm
por ChicoMaravilla
Teorema del Binomio
Programación C/C++
Black Lotus 1 5,856 Último mensaje 23 Mayo 2013, 16:06 pm
por leosansan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines