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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda - Funcion factorial de un numero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda - Funcion factorial de un numero  (Leído 6,393 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Ayuda - Funcion factorial de un numero
« en: 30 Junio 2012, 01:12 am »

Hola, buenas... soy Mike Gonzalez. Estoy haciendo una calculadora por consola, mas bien el modulo de calcular y despues hare la GUI en VB6.
Tengo una funcion hecha que me permite calcular el factorial de un numero:

Código
  1. unsigned long int factorial(short int numero) {
  2.    int pred = 0;
  3.    unsigned long int tmp = numero;
  4.    for (pred = --numero; pred > 1; --pred)
  5.        tmp *= pred;
  6.    return tmp;
  7. }

Las declaraciones son unsigned porque se supone que asi gano mas memoria de calculo (en el almacenamiento de variables). Mi pregunta es que solo me permite calcular hasta el factorial de 25 (a partir de ahi da resultados negativos :S).
Alguna solucion de mejorar el codigo y/o permitirme calcular numeros mas elevados (las calculadoras normales llegan al 69).

Gracias de antemano.


En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Ayuda - Funcion factorial de un numero
« Respuesta #1 en: 30 Junio 2012, 01:42 am »

Hola! este tema se planteo varias veces en la mayoria la respuesta final es buscar alguna libreria externa para poder operar con numero mas grandes

Saludos


En línea

Ahorrate una pregunta, lee el man
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: Ayuda - Funcion factorial de un numero
« Respuesta #2 en: 30 Junio 2012, 01:53 am »

Bueno, sera eso lo que tenga que hacer, muchas gracias por la ayuda, aunque se me ocurrio ahora mismo otra manera:

Hacer la funcion como ld (long double) y las variables al estilo:
 
Código
  1. unsigned long double factorial(short int numero) {
  2.    int pred = 0;
  3.    unsigned long double tmp = numero;
  4.    for (pred = --numero; pred > 1; --pred)
  5.        tmp *= pred;
  6.    return tmp;
  7. }
  8.  
Despues se me ocurre llamarlas/almacenarlas directamente como uld (unsigned long double) o escribirlas en pantalla: printf("%lld", factorial(x));
En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
$Edu$


Desconectado Desconectado

Mensajes: 1.842



Ver Perfil
Re: Ayuda - Funcion factorial de un numero
« Respuesta #3 en: 30 Junio 2012, 01:59 am »

Hacelo recursivamente, busca sobre funciones recursivas con ejemplos de factorial de un numero.

Factorial(n) {
if (n = 1) return 1;

return Factorial(n) * Factorial(n - 1);
}

Algo asi seria, cuando busques entenderas mejor.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Ayuda - Funcion factorial de un numero
« Respuesta #4 en: 30 Junio 2012, 03:31 am »

.
unsigned long long

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda - Funcion factorial de un numero
« Respuesta #5 en: 30 Junio 2012, 09:24 am »

XD, vaya idiotez que habia puesto. Eso me pasa por no leer bien las cosas.

Lo que pasa es que el factorial crece muy rapido, y los enteros en C, ocupan una cantidad finita de bytes (supongo que con los procesadores actuales cuatro u ocho bytes). En cuanto te pasas de esa cantidad supongo que almacenara los bytes de menor peso del resultado (aunque no puedo asegurarlo, solo lo supongo), es por eso que te aparecen numeros extraños.

Tienes dos opciones. Utilizar una libreria para manejar enteros arbitrariamente grandes (huge int, creo que se llaman...), o crearte tu tu propio tipo de dato entero para que no tenga limites, por ejemplo, utilizando vectores.

¡Saludos!
« Última modificación: 30 Junio 2012, 11:31 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: Ayuda - Funcion factorial de un numero
« Respuesta #6 en: 30 Junio 2012, 12:38 pm »

Muchas gracias por la respuesta a todos, me sirvieron para fomentar el estudio de C. Creo que tengo un mente una solucion, cuando termine posteare la funcion para calcular factorial de numeros mas grandes.


Hacelo recursivamente, busca sobre funciones recursivas con ejemplos de factorial de un numero.

Factorial(n) {
if (n = 1) return 1;

return Factorial(n) * Factorial(n - 1);
}

Algo asi seria, cuando busques entenderas mejor.

Si, se lo que es hacer una funcion recursiva y demas pero el tamaño al que llega es el mismo. Por si acaso no sabia algo lo probe y sigue siendo lo mismo, pero gracias por la respuesta.


unsigned long long


Ya lo probe, y sigue igual pero gracias de todas formas.


Tienes dos opciones. Utilizar una libreria para manejar enteros arbitrariamente grandes (huge int, creo que se llaman...), o crearte tu tu propio tipo de dato entero para que no tenga limites, por ejemplo, utilizando vectores.


No se exactamente como hacer que no tenga limites utilizando vectores... un nuevo tipo de datos se declara como typedef, en que me puede ayudar? :S
« Última modificación: 30 Junio 2012, 12:45 pm por Miky Gonzalez » En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Ayuda - Funcion factorial de un numero
« Respuesta #7 en: 30 Junio 2012, 13:19 pm »

Por ejemplo, creas un struct con un vector de unsigned char (0 - 255) para almacenar el valor del numero, y oto campo char (-128, 127) con valores -1 y 1 para el signo. Y defines por tu cuenta la suma, resta, multiplicacion y division de elementos de este tipo. Tendrias que fijar una base para representar los numeros de forma interna, y despues de cada operacion asegurarte de que el resultado se traduce a dicha base... por ejemplo, poniendo entre parentesis el signo y entre corchetes, del byte menos significativo al mas significativo, en base 16, podrias hacer:

(1)[12][15] + (1)[10] = (1)[22][15] = (1)[6 + 16][15] = (1) [6][16] = (1)[6][0][1]

Y asi con el resto de las operaciones...

¡Saludos!

Le estoy echando un ojo de forma algebraica al asunto, y el echo de pasar de base 16 a base 10 sin pasar por multiplicar las cifras por las correspondientes potencias de 16 es (parece) algo que no resulta trivial. Aunque malgastes espacio, lo mejor seria utilizar base 10 para almacenar de forma interna los datos... Esto ultimo es por dar salida a los datos. Sigo trabajando a ver si he pasado algo por alto o puedo simplificar cosas. Aunque aparecen por ahi factoriales y potencias muy feos...
« Última modificación: 30 Junio 2012, 13:44 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: Ayuda - Funcion factorial de un numero
« Respuesta #8 en: 30 Junio 2012, 13:25 pm »

Por ejemplo, creas un struct con un vector de unsigned char (0 - 255) para almacenar el valor del numero, y oto campo char (-128, 127) con valores -1 y 1 para el signo. Y defines por tu cuenta la suma, resta, multiplicacion y division de elementos de este tipo. Tendrias que fijar una base para representar los numeros de forma interna, y despues de cada operacion asegurarte de que el resultado se traduce a dicha base... por ejemplo, poniendo entre parentesis el signo y entre corchetes, del byte menos significativo al mas significativo, en base 16, podrias hacer:

(1)[12][15] + (1)[10] = (1)[22][15] = (1)[6 + 16][15] = (1) [6][16] = (1)[6][0][1]


Entendi ya un poco, creo que me costara implementarlo porque no quiero tirar de librerias externas, pero es una solucion bastante buena pero complicada de hacer; Muchas gracias. Mientras, solucion temporal:

Código
  1. double factorial(short int numero) {
  2.    int pred = 0;
  3.    double tmp = numero;
  4.    for (pred = --numero; pred > 1; --pred)
  5.        tmp *= pred;
  6.    return tmp;
  7. }
  8.  

Y llamarlo: printf("Factorial de 87: %.20lg", factorial(87));
Dandonos como salida: Factorial de 87: 2.1077572983795269087e+132

La exactitud viene marcada por el numero de decimales que coja (en este caso 20).
En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Ayuda - Funcion factorial de un numero
« Respuesta #9 en: 30 Junio 2012, 20:09 pm »

Lo mejor sería que usaras la librería gmp para esto, pero si es para un factorial, podrías checar el siguiente enlace:

http://mailman.linuxchix.org/pipermail/courses/2002-November/001043.html
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Factorial de un numero!
Programación C/C++
barnix456 3 3,346 Último mensaje 12 Mayo 2012, 17:00 pm
por barnix456
Error al hacer la factorial de un numero en C
Programación C/C++
diegofah 2 2,804 Último mensaje 6 Septiembre 2013, 16:49 pm
por ecfisa
[Ayuda] Hallar la suma de los dígitos de el factorial de 100
Programación C/C++
Loperso 4 4,231 Último mensaje 29 Abril 2016, 20:49 pm
por MAFUS
Problemas con programa k calcula factorial del numero
PHP
elbrujo20 1 2,416 Último mensaje 29 Septiembre 2017, 22:39 pm
por ivancea96
Factorial de un Número : duda
Programación C/C++
snoopty 5 3,562 Último mensaje 16 Enero 2022, 13:32 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines