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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error al hacer la factorial de un numero en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error al hacer la factorial de un numero en C  (Leído 2,781 veces)
diegofah

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Error al hacer la factorial de un numero en C
« en: 6 Septiembre 2013, 05:36 am »

Buenas a todos, este es el primer mensaje que hago ya que recién estoy comenzando en esto de la programación, no se si es muy básica mi pregunta (ya que veo preguntas que no entiendo en el foro), ojala me puedan ayudar, bueno yendo al punto, tengo que hacer un código para hallar el factorial de un número del 1 al 27 y tiene que ser impar positivo sin decimales, todo bien, pero cuando quiero sacar el factorial digamos de 25 no me da el valor correcto (comprobando con la calculador de la PC), no se donde podría estar el problema? ojala me puedan ayudar, y sry si es muy de novato la pregunta, gracias de antemano a todos.

Código:
#include<stdio.h>
#include<math.h>
#include<conio.h>
//factorial de un numero dado en rago de 1 a 27
main()
{
int i,x,z;
double P;
float n,y;
printf("\t\tInserte un numero entero impar entre 1 y 27\n\n");
printf("n:");
 if (fscanf(stdin,"%f",&n))
  {
  x=n;
  y=n-x;
  if(y==0)
   {
    z=fmod(x,2);
if((x>0) && (x<28))
{
 if(z==1)
       {
        P=1;
        i=1;
        while(i<=n)
         {
          P*=i;
          i++;
         }
         printf("El factorial de n=%1.0f es %1.0f",n,P);
       }
      else printf("no es un numero impar");
}
else printf("no esta dentro el rango");
   }
   else printf("No es un numero entero");
  }
 else
  {
   printf("no es un numero\n");
  }
  getch ();
  return 0;
}


« Última modificación: 6 Septiembre 2013, 05:40 am por diegofah » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Error al hacer la factorial de un numero en C
« Respuesta #1 en: 6 Septiembre 2013, 08:03 am »

Nota inicial: para dar color al código, la etiqueta code tienes que dejarla así (pero sin espacios): [ code = c ]

Código
  1.  x=n;
  2.  y=n-x;
  3.  if(y==0)
  4.  {
  5.  

Si x = n entonces y = 0, luego siempre va a entrar en el if. Eso no tiene demasiado sentido, no?

Además la asignación x = n te genera otro problema y es que estás usando el mismo valor en dos variables. Quiero decir, luego no modificas ni n ni x, por lo que te puedes ahorrar el uso de una de las dos variables.

Si lo que quieres es limitar la entrada a números enteros, puedes hacerlo así:

Código
  1. int dato;
  2.  
  3. // leemos un numero entero
  4. fscanf( stdin, "%d", &dato );
  5.  
  6. // lo convertimos a float
  7. float n = (float)dato;

Mas cosillas, lo del uso de fmod no lo he terminado de entender. Me explico:

Código
  1.    z=fmod(x,2);
  2. if((x>0) && (x<28))
  3. {
  4.  if(z==1)

La validación del rango de valores ( de 1 a 27 ) debería comprobarse nada más recibir el dato por parte del usuario, no 6 líneas más abajo. Dicho de otra forma, si el usuario introduce un dato incorrecto lo normal es avisarle en ese mismo momento, además el código te quedará más claro.

Si lo que quieres saber es si un número es par o impar tienes opciones mucho más sencillas, rápidas y eficientes:

Código
  1. // Comprobar si el número es par
  2. if ( x % 2 == 0 )
  3.  
  4. // Comprobar si el número es impar
  5. if ( x % 2 != 0 )

Lo de que te salga mal el resultado ahora no lo puedo mirar porque no puedo compilar tu código ahora. Si tengo tiempo luego y nadie te ha contestado intento ayudarte más.

Un saludo.


En línea

ecfisa

Desconectado Desconectado

Mensajes: 114


Ver Perfil
Re: Error al hacer la factorial de un numero en C
« Respuesta #2 en: 6 Septiembre 2013, 16:49 pm »

Hola diegofah.

Copié tu código y parece dar el resultado correcto.

Pero, según entiendo, si el tipo que estás utilizando para almacenar el resultado del factorial es de 64 bits el máximo valor almacenable es :
Código:
2^64  = 18446744073709551616
20!   =  2432902008176640000 (correcto)
21!   = 51090942171709440000 (desborde)


Si fuese de 128 bits:
Código:
2^128 = 340282366920938463463374600000000000000
34!   = 295232799039604006218354100000000000000   (correcto)
35!   = 10333147966386100700879664000000000000000 (desborde)

De todos modos, si la especificación del código es que sólo calcule los factoriales de los números impares comprendidos entre 1 y 27, creo que el código se puede simplificar bastante. Por ejemplo:

Código
  1. #include<stdio.h>
  2. #include<math.h>
  3.  
  4. double fact(char);
  5.  
  6. main()
  7. {
  8. int n;
  9.  
  10. do {
  11.   printf("Inserte un numero entero impar entre 1 y 27:");
  12.   fscanf(stdin, "%d", &n);
  13.   while(getchar()!='\n');
  14. } while (n<1 || n>28 || n % 2 == 0);
  15.  
  16. printf("El factorial de %d es %0.0f\n",n, fact(n));
  17.  
  18. return 0;
  19. }
  20.  
  21. double fact(char num)
  22. {
  23. double fact = 1;
  24. while (num > 0)
  25.   fact *= num--;
  26. return fact;
  27. }
  28.  

Saludos :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular el factorial de un numero [Batch]
Scripting
leogtz 0 14,076 Último mensaje 10 Abril 2009, 20:11 pm
por leogtz
[C]Factorial de un numero
Programación C/C++
HRSLASH 5 5,666 Último mensaje 9 Agosto 2010, 23:04 pm
por leogtz
Factorial de un numero!
Programación C/C++
barnix456 3 3,324 Último mensaje 12 Mayo 2012, 17:00 pm
por barnix456
Ayuda - Funcion factorial de un numero
Programación C/C++
Miky Gonzalez 9 6,345 Último mensaje 30 Junio 2012, 20:09 pm
por leogtz
Problemas con programa k calcula factorial del numero
PHP
elbrujo20 1 2,382 Último mensaje 29 Septiembre 2017, 22:39 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines