Teorema del Binomio

Iniciado por Black Lotus, 23 Mayo 2013, 01:06 AM

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

Black Lotus

Se trata de crear un programa para que resuelva ejercicios del teorema del binomio, sin embargo se tiene el problema de que solo realiza ejercicios con signo positivo tales como hasta el exponente 12, sin embargo no se puede realizar ejercicios que contentan signo negativos tales como: .... Entonces me ayudarian a darme la idea o arreglar el codigo a modo que se pueda hacer operaciones con signo negativo?

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <conio>
#include <stdlib>

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 r, n, p, num , y ,n1, n2, resu1, resu2, resul;
    char a,b;
    char t1, t2, p1;
    char op;
do {
ret:
clrscr();
cout<<"\n         ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»";
cout<<"\n         º                   :: Suma de Binomios ::                  º";
cout<<"\n         ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ";
cout<<"\n          Escriba el Exponente de la Ecuaci\242n:  ";
cin>> p1;
if ((p1>48) && (p1<58))
goto sig; else goto ret;
sig:
cout <<"\n          Escribir el T\202rmino numerico:  ";
cin >> t1 ;
if ((t1>48) && (t1<58))
goto sig2; else goto sig;
sig2:
cout <<"\n          Escribir el Primer T\202rmino:  ";
cin >> a ;
if ((a>64) && (a<91) || (a>96) && (a<123))
goto sig3; else goto sig2;
sig3:
cout <<"\n          Escribir el T\202rmino numerico:  ";
cin >> t2 ;
if ((t2>48) && (t2<58))
goto sig4; else goto sig3;
sig4:
cout <<"\n          Escribir el Segundo T\202rmino:  ";
cin >> b ;
if ((b>64) && (b<91) || (b>96) && (b<123))
goto sig5; else goto sig4;
sig5:
cout<<endl;
cout<<"          El Producto Notable de ("<<t1<<a<<"+"<<t2<<b<<")^"<<p1<<" es...";
cout<<endl<<endl;
n  = p1 - 48;


    for (p=0; p<=n; p++)
    {
        n1 = t1 - 48;
        n2 = t2 - 48;
        resu2 = ( pow(n2,p)) ;
        y = n - p;
        resu1 = ( pow(n1,y)) ;

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

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

    }

    cout<<endl<<endl;
    cout<<"Ingresar la posicion que deseas averiguar:";
    cin >> r ;
        p = r-1;
        y = n - p;
        num = fact(n) / (fact(p) * fact(y));
        resul= resu1*num*resu2;
     cout<<"la posicion es :";
     cout<< resul<<" " << a << "^ " << y << " * " << b <<"^ " << p ;
    cout<<endl<<endl;

}while (op != 50);

}

leosansan

#1

Creo que te has hecho la p*cha un lío. No me explico como no metes la gamba entre tanto paréntesis y goto, con lo fáciles que son los do-while a la hora de revisar el código. Pero en fin, tú mismo.

Creo que andabas buscando una salida como esta:


Código (cpp) [Seleccionar]

escriba el exponente de la ecuacion = 4
escribir el primer coeficiente (numero)= 2
escribir el segundo coeficiente (numero)= 3
escribir el primer coeficiente (letra en minuscula)= a
escribir el segundo coeficiente (letra en minuscula)= b
+16 a^ 4-96 a^ 3 * b^ 1+216 a^ 2 * b^ 2-216 a^ 1 * b^ 3+81 b^ 4
Presione una tecla para continuar . . .

Mejor escrito:

16 a^4 - 96 a^3 b + 216 a^2 b^2 - 216 a b^3 + 81 b^4



con signos, coeficientes numéricos y coeficientes "letrados"  ;)

Ta´bien, te paso el código:
:)

Código (cpp) [Seleccionar]


#include <iostream>
#include <cmath>    
#include <cstdlib>  
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,c,d,p, num ,y, y1=0,expon;
   char coef_1,coef_2,signo,a,b;
   cout << "escriba el exponente de la ecuacion = ";
   cin >> expon;
       
   do{
       cout << "escribir el primer coeficiente (numero)= ";
       cin >>coef_1 ;
   }while (coef_1<48 || coef_1>58);
   do{
   cout << "escribir el segundo coeficiente (numero)= ";
   cin >>coef_2 ;
   }while (coef_2<48 || coef_2>58);
   do{
       cout << "escribir el primer coeficiente (letra en minuscula)= ";
       cin >>a ;
   }while (a>64 && a<96);
   do{
   cout << "escribir el segundo coeficiente (letra en minuscula)= ";
   cin >>b ;
   }while (b>64 && b<96);
   n=expon;
   c=coef_1-48;
   d=coef_2-48;
   for (p=0; p<=n; p++,y1++)
   {
       num = comb(n,p);
       y=n-p;
       if ( p%2==0)
           signo='+';
       else
           signo='-';
       if (p==0 )
           cout<<signo<< pow(c,n) <<" " << a <<"^ " << n;
       else if ( p==n)
           cout <<signo<< pow(d,n) <<" "<< b <<"^ " << p ;
      else {

       cout <<signo<< num*pow(c,n-y1)*pow(d,y1) <<" "<<a<< "^ " << y << " * " << b<<"^ " << p  ;
      }
    }
   cout <<endl;
   system("pause") ;
   return 0;
}



Espero te sirva de referencia al menos.

Por cierto lo del número combinatorio es para obtener potencias superiores a 12, que si no salen más es porque C/C++ "no pueden" con números tan grandes como los que originan los factoriales al calcular los números combinatorios y de esta manera pueden ser de 20 y más, dependiendo de los coeficientes .Si son uno no hay problema pero cuando los subes, la combinación entre el tamaño de los combinatorios y las potecias de los mencionados numeros hacen que el exponente no pueda ser muy grande. Son las miserias cel C/C++ con números grrandes como ya te indiqué. Habría que usar una librería de números grandes, como GMP, para poder hacer cálculos sin esas limitaciones del C/C++.Una explicación más amplia en: Teorema Binomial

Saluditos!. .... ..




P.D:A mí personalmente no me acaba se satisfacer el código ya que limitas la entrada de coeficientes a números entre 0 y 9, cuando declarándolos directamente como int en lugar de char no tendrías esa limitación. O bien los declaras como char pero como array para pillar todas las cifras y luego hacer una conversión de cadena a entero, que para eso existen las funciones apropiadas. Pero bueno, tal como lo tenías he procurado no "menartelo" mucho.
:laugh: