elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calcular las n raices racionales de un polinomio grado n (dudas particulares)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular las n raices racionales de un polinomio grado n (dudas particulares)  (Leído 5,995 veces)
tenshi96

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Calcular las n raices racionales de un polinomio grado n (dudas particulares)
« en: 22 Mayo 2016, 03:44 am »

Buenas, es un trabajo y se me acaba el tiempo.
tengo 2 problemas...
El programa que llevo hecho me da una lista de las posibles raíces racionales que tendrá el polinomio, lo que quiero añadir ahora es que de esa lista elimine los elementos repetido, no eh logrado hacerlo bien y ya lo batalle bastante.
Me salte ese paso aunque sabia que seria mas tardado, que todas las posibles raíces las pruebe haber cual es, ya que sepa cual es, las guarde en un vector y al final me diga "estas son las raíces"

Les dejo el código que llevo y al final una explicación de como se hace a mano, lápiz y calculadora.
por favor lo menos C++ que puedan usar.

Codigo:
Código
  1. #include<stdio.h>
  2. #include<math.h>
  3. #define MD 99
  4. #define MDU 9999 //MaximaDimensionUltra
  5.  
  6. int main(){
  7. int i,j,c,e,Comb;
  8. int P[MD],n,Factorizo;
  9. //int MNR;//Maximo Numero de Raices
  10. float DC[MD],DE[MD];//Divisores Constante/Exponente
  11. int NMDc,NMDe,NMComb;//Numero Maximo Divisores constante/exponente NumeroMaximoCombinaciones
  12. double PR[MDU]; //Posibles Raices
  13.  
  14. printf("Dame el grado del polinomio\n");
  15. scanf("%d",&n);
  16.  
  17. if(n<0){
  18. printf("No es un polinomio");
  19. }
  20.  
  21. if(n==0){
  22. printf("No es un polinomio, es una constante");
  23. }
  24.  
  25. if(n>0){
  26. printf("\nDame el coeficiente de cada X\n");
  27. printf("NOTA: X^0 es la constante\n\n");
  28.  
  29.  
  30. for(i=0;i<n+1;i++){
  31. printf("X^%d= ",i);
  32. scanf("%d",&P[i]);
  33. }
  34.  
  35. printf("\nPolinomio:\n");
  36. for(i=0;i<n+1;i++){
  37. printf("(%d)X^%d",P[i],i);
  38. if(i != n) printf("+");
  39. }
  40.  
  41.  
  42. if(P[0]==0){
  43. Factorizo=0;
  44. for(i=0;i<Factorizo+1;i++){
  45. if(P[i]==0){
  46. Factorizo=Factorizo+1;
  47. }
  48. }
  49.  
  50. printf("\n\nPero podemos factorizar %d X, por lo tanto ya sabemos que tiene %d raices igual a 0\n\n",Factorizo,Factorizo);
  51.  
  52. for(i=0;i<n+1;i++){
  53. P[i]=P[i+Factorizo];
  54. }
  55.  
  56. printf("\nNuevo Polinomio:\n");
  57. for(i=0;i<n+1-Factorizo;i++){
  58. printf("(%d)X^%d \n",P[i],i);
  59. }
  60. }
  61.  
  62. else{
  63. Factorizo=0;
  64. }
  65.  
  66. if(P[n]==0){
  67. n=n-1;
  68. for(i=n;i>n-1;i--){
  69. if(P[i]==0){
  70. n=n-1;
  71. }
  72. }
  73.  
  74.  
  75.  
  76. printf("\n\nY tambien podemos eliminar algunas X\nNuevo Polinomio:\n");
  77. for(i=0;i<n+1;i++){
  78. printf(" %dX^%d\n",P[i],i);
  79. }
  80. }
  81.  
  82. printf("\nDivisores de constante\n");
  83. c=0;
  84. NMDc=0;
  85. for(i=1;i<P[0]+1;i++){
  86. if(P[0]%i==0){
  87. DC[c]=i;
  88. c++;
  89. NMDc=NMDc+1;
  90. }
  91. }
  92.  
  93. printf("\nA %d lo dividen:\n",P[0]);
  94. for(c=0;c<NMDc;c++){
  95. printf("%f\n",DC[c]);
  96. }
  97.  
  98. printf("\n\nDivisores de exponente\n");
  99. e=0;
  100. NMDe=0;
  101. for(i=1;i<P[n]+1;i++){
  102. if(P[n]%i==0){
  103. DE[e]=i;
  104. e++;
  105. NMDe=NMDe+1;
  106. }
  107. }
  108.  
  109. printf("\nA %d lo dividen:\n",P[n]);
  110. for(e=0;e<NMDe;e++){
  111. printf("%f\n",DE[e]);
  112. }
  113.  
  114. Comb=0;
  115. NMComb=0;
  116. for(i=0;i<NMDc;i++){
  117. for(j=0;j<NMDe;j++){
  118. PR[Comb]=DC[i]/DE[j];
  119. Comb++;
  120. NMComb=NMComb+1;
  121. }
  122. }
  123.  
  124. printf("\nPosibles Raices:\n");
  125. for(i=0;i<NMComb;i++){
  126. printf("%f\n",PR[i]);
  127. }
  128.  
  129. }
  130. return 0;
  131. }


→Como hacerlo a mano:
primero factorizas lo que sea necesario para que el polinomio tenga una constante, ya que tenga una constante buscas todos los números enteros que dividen ese numero (Nota: la constante debe ser entera), después tomas el coeficiente de la X exponencial mas grande y buscas todos los números enteros que lo dividen.
Tienes 2 listas, divisores de constante y divisores del coeficiente de la X exponencial mas grande.
Comienzas a dividir todas constantes entre todos los divisores de exponencial. tendrás una nueva lista de posibles raíces racionales... pero esto solo son las positivas, copias esa lista pero con signo negativo y ya tienes una nueva lista.

pruebas cada uno de esos números que obtuviste al dividir, positivos y negativos en el polinomio, y si alguno te da 0, Es raiz.

Gracias de antemano


« Última modificación: 23 Mayo 2016, 04:16 am por engel lex » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Calcular las n raices racionales de un polinomio grado n (dudas particulares)
« Respuesta #1 en: 22 Mayo 2016, 17:14 pm »

Detecte un error en tu codigo, P es un arreglo pero ahi capturas en la direcccion de P y corresponfe solo al elemento P[0]....

Código
  1. for(i=0;i<n+1;i++){
  2.      printf("X^%d= ",i);
  3.      scanf("%d",&P);
  4.   }

No he visto el demas codigo pero es lo que vi en este momento....

Ya qie tenga la laptop en frente lo reviso a fondo.

Saludos.


En línea

JavierScars

Desconectado Desconectado

Mensajes: 116



Ver Perfil
Re: Calcular las n raices racionales de un polinomio grado n (dudas particulares)
« Respuesta #2 en: 23 Mayo 2016, 04:12 am »

Código:
#include<stdio.h>
#include<math.h>
#define MD 99
#define MDU 9999 //MaximaDimensionUltra

int main(){
   int i,j,c,e,Comb, op;
   int P[MD],n,Factorizo;
   //int MNR;//Maximo Numero de Raices
   float DC[MD],DE[MD], temp;//Divisores Constante/Exponente
   int NMDc,NMDe,NMComb;//Numero Maximo Divisores constante/exponente NumeroMaximoCombinaciones
   double PR[MDU]; //Posibles Raices

   printf("Dame el grado del polinomio\n");
   scanf("%d",&n);

   if(n<0){
   printf("No es un polinomio");
   }

   if(n==0){
      printf("No es un polinomio, es una constante");
   }

   if(n>0){
   printf("\nDame el coeficiente de cada X\n");
   printf("NOTA: X^0 es la constante\n\n");


   for(i=0;i<n+1;i++){
      printf("X^%d= ",i);
      scanf("%d",&P[i]);
   }

   printf("\nPolinomio:\n");
   for(i=0; i < n+1; i++){
   printf("(%d)X^%d",P[i],i);
   if(i != n) printf("+");
   }


      if(P[0]==0){
         Factorizo=0;
            for(i=0;i<Factorizo+1;i++){
               if(P==0){
                  Factorizo=Factorizo+1;
                  }
               }

            printf("\n\nPero podemos factorizar %d X, por lo tanto ya sabemos que tiene %d raices igual a 0\n\n",Factorizo,Factorizo);

            for(i=0;i<n+1;i++){
            P[i]=P[i+Factorizo];
            }

            printf("\nNuevo Polinomio:\n");
            for(i=0;i<n+1-Factorizo;i++){
               printf("(%d)X^%d \n",P,i);
                  }
               }

      else{
         Factorizo=0;
      }

         if(P[n]==0){
         n=n-1;
         for(i=n;i>n-1;i--){
            if(P==0){
               n=n-1;
            }
         }



   printf("\n\nY tambien podemos eliminar algunas X\nNuevo Polinomio:\n");
         for(i=0;i<n+1;i++){
         printf(" %dX^%d\n",P,i);
      }
   }

      printf("\nDivisores de constante\n");
      c=0;
      NMDc=0;
      for(i=1;i<P[0]+1;i++){
         if(P[0]%i==0){
            DC[c]=i;
            c++;
            NMDc=NMDc+1;
            }
      }

      printf("\nA %d lo dividen:\n",P[0]);
         for(c=0;c<NMDc;c++){
         printf("%.0f\n",DC[c]);
         }

   printf("\n\nDivisores de exponente\n");
      e=0;
      NMDe=0;
      for(i=1;i<P[n]+1;i++){
         if(P[n]%i==0){
            DE[e]=i;
            e++;
            NMDe=NMDe+1;
            }
      }

      printf("\nA %d lo dividen:\n",P[n]);
         for(e=0;e<NMDe;e++){
         printf("%.0f\n",DE[e]);
         }

   Comb=0;

   NMComb=0;
   for(i=0;i<NMDc;i++){
      for(j=0;j<NMDe;j++){
         PR[Comb] = DC[i] / DE[j];
         Comb++;
         NMComb = NMComb+1;
      }
   }

    for (i=0; i<NMComb; i++)
   {
       op = 1;

       for(j=0; j<NMComb; j++)
       {
           if(PR[j] < PR[i])
           {
               temp = PR[i];
               PR[i] = PR[j];
               PR[j] = temp;
           }

           if(PR[j] == PR[i]  && i != j)
           {
               PR[j] = 999;
           }

       }
   }

   printf("\nPosibles Raices:\n");
      for(i=0;i<NMComb;i++){
            if(PR[i] != 999)
         printf("%.4f\n",PR[i]);
      }

   }
   return 0;
}
Ahi esta ya lo primero resuelto para calcular cuales son las raices que funcionan tienes que hacer dentro de un for que pruebe con los resultados sustituyendolos en x y efectuando las operaciones si el resultado de todo da 0 que imprima dicho valor y ya.
En línea

Usa lo malo de la vida a tu favor, escala montañas de problemas para deslizarte sobre soluciones, derrumba muros de decepciones para encontrar la libertar de la felicidad,  y quema la leña del fracaso para calentarte con el éxito. Recuerda que sin la oscuridad la luz no brillaría tanto.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines