Autor
|
Tema: Teorema Binomial (Leído 5,110 veces)
|
Black Lotus
Desconectado
Mensajes: 26
|
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^3El codigo es el siguiente: #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(); }
|
|
|
En línea
|
|
|
|
flony
Desconectado
Mensajes: 584
|
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
Mensajes: 1.314
|
Supongo que es algo como esto lo que pretendes:
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
#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!. ...
|
|
« Última modificación: 18 Abril 2013, 04:53 am por leosansan »
|
En línea
|
|
|
|
Black Lotus
Desconectado
Mensajes: 26
|
Supongo que es algo como esto lo que pretendes:
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í:
|
|
|
En línea
|
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:#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: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: 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".
|
|
« Última modificación: 19 Abril 2013, 02:11 am por leosansan »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[C] Teorema de Pitágoras
« 1 2 3 »
Programación C/C++
|
STANHMAL
|
22
|
20,901
|
8 Julio 2010, 02:35 am
por .:BlackCoder:.
|
|
|
[Código] Teorema de Pítagoras [Python]
Scripting
|
@Sthéfano
|
0
|
5,999
|
26 Julio 2010, 22:34 pm
por @Sthéfano
|
|
|
[Python] Coeficiente Binomial.
Scripting
|
[L]ord [R]NA
|
0
|
6,034
|
6 Septiembre 2010, 16:37 pm
por [L]ord [R]NA
|
|
|
Teorema del seno
Programación C/C++
|
ChicoMaravilla
|
3
|
3,430
|
10 Noviembre 2011, 13:55 pm
por ChicoMaravilla
|
|
|
Teorema del Binomio
Programación C/C++
|
Black Lotus
|
1
|
5,844
|
23 Mayo 2013, 16:06 pm
por leosansan
|
|