Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/11/2012, 19:06
Avatar de cotolon
cotolon
 
Fecha de Ingreso: octubre-2012
Mensajes: 55
Antigüedad: 12 años
Puntos: 10
Respuesta: Multiplicacion de polinomios en c++ builder

Parece un poco problemático la cosa, bueno te voy a dar tips más "sólidos" (no tanto)

Primero para generar un número al azar se usa la función "rand". Puedes ver su uso aquí:
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

Para poder usarla debes colocar un #include <stdlib.h> o algo parecido (según como lo acepte el C++ Builder)

Primero empiezas pidiendo al usuario 2 valores de tipo int "grado1" y "grado2"

Puedes hacerlo con printf scanf (necesitarias #include <stdio.h) ej:

Código C++:
Ver original
  1. printf("Ingresa grados de los polinomios.  Ej: 4 3 \n");
  2. scanf("%d %d", &grado1, &grado2)

Seguido de esto creas 2 arrays de tipo int (no trabajan con decimales supongo)

Código C++:
Ver original
  1. int polinomio1[grado1+1], polinomio2[grado2+1];

Aquí está el tip, por ejemplo si grado1 = 3 significa que es de la forma
ax^3 + bx^2 + cx + d
Por lo tanto sería polinomio1[4]; //de 4 elementos por ej (de polinomio1[0] .. polinomio1[3])
En donde

polinomio1[3] = valor de a (ya que el "3" indicaria que lo acompaña el x^3)
polinomio1[2] = valor de b (ya que el "2" indicaria que lo acompaña el x^2)
polinomio1[1] = valor de c (ya que el "1" indicaria que lo acompaña el x^1)
polinomio1[0] = valor de d (ya que el "0" indicaria que lo acompaña el x^0)

Espero lo entiendas, entonces puedes hacer un for para rellenar el array, por ej:

Código C++:
Ver original
  1. srand ((unsigned) time(NULL) ); //Si te da error quita el unsigned
  2. for(int i = 0; i < grado1+1; i++)
  3.     polinomio1[i] = rand()%19-9;
Eso del srand se coloca porque creo que lo hace más al "azar", ya que rand es un pseudo-random (calculado por fórmula creo más que por azar)
rand()%19 indicaría un número al azar entre 0 y 18 y con -9 seria entre -9 y 9

Y de la misma forma llenas polinomio2

Quedaría la parte de multiplicar
aquí podría complicar, lo que tendrías que hacer sería encontrar como multiplicar por coef sin importar el grado (Podría haber una "fórmula" similar para todas).

Espero te sirva, Saludos.

Actualizado:

Imaginemos esto:

usuario ingresa grado1 = 3 grado2 = 2, crea polinomio1[4] polinomio2[3]

Sabemos que un polinomio se multiplica término por término, así que por ej

(4x^3 + 3x^2 + 2x + 1) * (3x^2 + 2x + 1)
Sería 4 *3 + 4 *2 + 4 * 1 + 3 *3 + 3*2 + ...... Y así hasta el último termino.

Por lo tanto esta sería una posible solución para sumar:

Código C++:
Ver original
  1. //pos = posicion  ter = termino
  2. //Polinomio donde termino mayor es un x^(grado1 + grado2)
  3. int polinomioResultante [grado1 + grado2 + 1];
  4.  
  5. //Iniciamos como 0 los valores del polinomio resultante
  6. for (int c = 0; c < grado1 + grado2 + 1; c++)
  7.     polinomioResultante[c] = 0;
  8. //Por cada termino del polinomio1
  9. for (int pos = 0; pos < grado1 + 1; pos++){
  10.     //Vamos a multiplicar cada termino del polinomio2
  11.     for (int ter = 0; ter < grado2 + 1; ter++){
  12.         //Voy a explicar luego del código
  13.         polinomioResultante[pos + ter] += polinomio1[pos] * polinomio2[ter];  
  14.     }
  15. }

Vamos a explicar: imagina que tenemos el polinomio 3x^2 + 2x + 1 y 4x + 5
El polinomio resultante seria este: 3x^2 * 4x + 3x^2*5 + 2x*4x + 2x*5 + 1*4x + 1 *5
Es decir: 12 x^3 + 15 x^2 + 8x^2 + 10 x + 4x + 5
Mas resumido: 12 x^3 + 23 x^2 + 14x + 5

...........
tomando grado1 = 2 grado2 = 1 pResultante[4] de 0 .. 3
Empieza el for de pos = 0; ter = 0;

eso equivale a pResul[0] = 1 * 5 = 5; el 0 ya que el resultado es x^0
ter = 1 -> pResul[1] = 1 * 4 = 4; (a 4x) el 1 es un x^1 que esta correcto
(Solo son 2 terminos, asi que paso a pos = 1)
ter = 0; pResul[1] = 2 *5 = 10; (a 10x) y se le suma pResul[1] de antes o sea 10 + 4 (14 x) Si miras el resultado esta correcto
ter = 1; pResul[2] = 2 *4 = 8; (a 8x^2)
(pos = 2)
ter = 0; pResul[2] = 3 * 5 = 15; se le suma pResul[2] de antes 8 + 15 = 23 (23x) que está correcto.
ter = 1 pResul[3] = 3 * 4 = 12; ( a 12 x^3)

Y listo!!!

Ahora solo mostramos El resultado:
(De la misma forma podrias mostrar los otros 2 polinomios)

Código C++:
Ver original
  1. //Si no es x >= 0 es x>0 solamente
  2. for (int x = grado1 + grado2; x >= 0; x--){
  3.      
  4.      printf("  %dx^%d", pResul[x], x );
  5.      //Para que no aparezca un + luego del último término
  6.      if (x != 0)
  7.      printf("   +  ");
  8. }

Última edición por cotolon; 10/11/2012 a las 19:46