Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Black Lotus en 23 Mayo 2013, 01:06 AM

Título: Teorema del Binomio
Publicado por: Black Lotus en 23 Mayo 2013, 01:06 AM
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 (http://www.eplc.umich.mx/salvadorgs/matematicas1/contenido/CapIII/3_5_5_teo_bin_archivos/image062.gif) hasta el exponente 12, sin embargo no se puede realizar ejercicios que contentan signo negativos tales como: (http://www.eplc.umich.mx/salvadorgs/matematicas1/contenido/CapIII/3_5_5_teo_bin_archivos/image070.gif).... 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);

}
Título: Re: Teorema del Binomio
Publicado por: leosansan en 23 Mayo 2013, 16:06 PM

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 (http://foro.elhacker.net/buscador2-t388312.0.html;msg1846605#msg1846605l)

Saluditos!. .... ..


(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)

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: