Teorema Binomial

Iniciado por Black Lotus, 18 Abril 2013, 03:02 AM

0 Miembros y 1 Visitante están viendo este tema.

Black Lotus

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 (cpp) [Seleccionar]

#include <iostream>
#include <math>
#include <conio>



long int fact(long int x)
{
    int z = 1;
    for (x; x >=1; x--)
    {
        z = z*x;
    }
    return z;
}

int main()
{
    long int n, p, num , y;
    char a,b;
    cout << "escriba el exponente de la ecuacion = ";
    cin >> n;
    cout << "escribir el primer termino = ";
    cin >>a ;
    cout << "escribir el primer termino = ";
    cin >>b ;

    for (p=1; p<=n; p++)
    {
        y = n - p;
        num = fact(n) / (fact(p) * fact(y));
        cout << a << "^" << " +" << num << b <<"^" << p ;

    }
    getch();
   
}



flony

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 )
si un problema no tiene solucion entonces no es un problema...es algo inevitable

leosansan

#2
Supongo que es algo como esto lo que pretendes:


Código (cpp) [Seleccionar]

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


Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;

long int fact(long int x)
{
   int z = 1;
   for (x; x >=1; x--)
   {
       z = z*x;
   }
   return z;
}

int main()
{
   long int n, p, num , y;
   char a,b;
   cout << "escriba el exponente de la ecuacion = ";
   cin >> n;
   cout << "escribir el primer termino = ";
   cin >>a ;
   cout << "escribir el segundo termino = ";
   cin >>b ;

   for (p=0; p<=n; p++)
   {
       y = n - p;
       num = fact(n) / (fact(p) * fact(y));
       if (p==0 )
           cout<< num <<" " << a << "^ " << n<< " + " ;
       else if ( p==n)
           cout << num <<" "<< b <<"^ " << p ;
      else {

       cout << num <<" "<< a << "^ " << y << " * " << b <<"^ " << p <<" + " ;
      }

   }

  return 0;
}


Saluditos!. ...

Black Lotus

Cita de: leosansan en 18 Abril 2013, 04:43 AM
Supongo que es algo como esto lo que pretendes:


Código (cpp) [Seleccionar]

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


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í:

leosansan

Cita de: Black Lotus en 18 Abril 2013, 17:27 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!. ...

leosansan

#5
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 (cpp) [Seleccionar]
#include <iostream>

using namespace std;


float comb(int n,int p)
{
   int i;
   if (n < 0 || p < 0 || p > n) return 0;
   float c = 1;
   if (p>n/2)
       p=n-p;
   for ( p; p>=1; p--,n--)
   c*= n/p;
   return c;
}
int main()
{
   long int n, p, num , y;
   char a,b;
   cout << "escriba el exponente de la ecuacion = ";
   cin >> n;
   cout << "escribir el primer termino = ";
   cin >>a ;
   cout << "escribir el segundo termino = ";
   cin >>b ;

   for (p=0; p<=n; p++)
   {
       num = comb(n,p);
       y=n-p;
       if (p==0 )
           cout<< num <<" " << a << "^ " << n<< " + " ;
       else if ( p==n)
           cout << num <<" "<< b <<"^ " << p ;
      else {

       cout << num <<" "<< a << "^ " << y << " * " << b <<"^ " << p <<" + " ;
      }

   }
   return 0;
}


He aquí la salida para exponente 20:

Código (cpp) [Seleccionar]

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


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 (cpp) [Seleccionar]
           
                                      1
                                  1     1
                               1     2     1
                            1     3     3     1
                         1     4     6     4     1
                      1     5     8     8     5     1
                   1     6    15    16    15     6     1
                1     7    18    30    30    18     7     1
             1     8    28    36    60    36    28     8     1
          1     9    32    84    72    72    84    32     9     1
       1    10    45    96   168   144   168    96    45    10     1
    1    11    50   135   192   336   336   192   135    50    11     1



¡ 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