¿Como se trabaja con big integers en C?

Iniciado por soplo, 14 Octubre 2010, 21:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Littlehorse

No exactamente, no depende solo de la arquitectura, también depende del modelo de datos utilizado en la plataforma y del entorno de desarrollo.
Por ejemplo, en la mayoría de Unix,Unix-like de arquitectura 64bits, el requerimiento mínimo de un long es 4 bytes, sin embargo un long y un long long tienen 8 bytes. Por otro lado, en un Windows/NT de arquitectura 64bits, un long tiene 4 bytes y un long long tiene 8.
El requerimiento mínimo de 8 bytes si aplica para los enteros long long u por ejemplo para los punteros, pero no para los enteros long.

Saludos.

An expert is a man who has made all the mistakes which can be made, in a very narrow field.

WaRc3L

El bigint no es estandar, si no me equivoco  :-\.

Tengo entendido que si tienes que trabajar con numero muy grandes que superan a los limites de los tipos basicos, se puede trabajar con cadenas ( strings ), y despues "simular" las operaciones matematicas.

Me equivoco? , es mejor usar el bigint, aunque no sea estandar?

Saludos!

WaRc3L
La verdad no se refleja en un espejo

soplo

Efectivamente no es estandar pero a veces es necesario y en absoluto veo que las operaciones que podrías necesitar con números grandes puedan resolverse con strings.

Bueno, poder poder lo que es poder seguramente se podrá (de hecho esas funciones de alguna forma se computan) pero intenta calcular un número de cincuenta dígitos elevado a uno de 100 a base de strings por ejemplo.

No son casos habituales pero tampoco son extremadamente raros. Por ejemplo seguramente si excedes 20! ya estas sobrepasando los tipos comunes. Que la gente habitualmente no anda calculando 50^50 o 50! estoy de acuerdo, pero creo que en diversas actividades es bastante probable encontrarse con ese tipo de problemas.

Un saludo
;D
Callar es asentir ¡No te dejes llevar!

ace332

#13
Citar
Bueno, poder poder lo que es poder seguramente se podrá ...
En efecto, como ejemplo el siguiente programa


/* Reto #18: Calcular el factorial de n, 0<=n<=100 */

#include <stdio.h>
#include <string.h>

#define MAX_LON_FACT 2600  /* suficiente para calcular el factorial de 1000 */

#define CharADig(c) ((int)((c)-'0'))
#define DigAChar(d) ((char)(d)+'0')

void mulenterolargo(int q,char *z)
{
 int temp=0,i,ltemp,lz=strlen(z);
 char stemp[15];

 for(i=lz-1;i>=0;i--)
 {
   temp+=CharADig(z[i])*q;
   z[i]=DigAChar(temp%10);
   temp/=10;
 }

 if(temp)
 {
   ltemp=sprintf(stemp,"%d",temp);
   memmove(&z[ltemp],&z[0],lz+1);
   memcpy(&z[0],stemp,ltemp);
 }
}

const char *factorial(int n,char fact[])
{
 int i;
 strcpy(fact,"1");
 for(i=2;i<=n;i++)
   mulenterolargo(i,fact);
 return fact;
}

int main(void)
{
 char fact[MAX_LON_FACT+1];
 int n;

 printf("Digite el n£mero: ");
 
 if(scanf("%d",&n)!=1 || n<0 || n>1000)
   return 1;
   
 printf("\n%d! = %s\n\n",n,factorial(n,fact));
 printf("Longitud = %d d¡gitos\n",strlen(fact));
 return 0;
}

Saludos!

soplo

Bien, pues tu usa eso si te hace feliz.

Yo usaré gmp que trabaja con esos valores directamente en binario y me hace feliz a mi.

Aparte de que si miras ese código verás o que está incompleto o no funciona. A mi me da igual porque no pienso usarlo je je je pero bueno. Aun suponiendo que funcionara ¿echamos una carrera a ver quien resuelve antes 894689038903^766656565656565 mod 8949083489008989090309

Porque en gmp eso es
// declaración de variables
mpz_t base,exponente, modulo, resultado;
//Inicializacion
mpz_init(base);
mpz_init(exponente);
mpz_init(modulo);
mpz_init(Resultado);
//inicializacion de valores
mpz_set_str(base,"894689038903");
mpz_set_str(exponente,"766656565656565");
mpz_set_rst("modulo,"8949083489008989090309");
// la operacion
mpz_powm(Resultado,base,exponente,modulo);


;D

P.D.
Que no te suene que me rio de ti o algo. Nada mas lejos. Solo tengo interes en la gente que está aprendiendo C que vea las posibilidades de esto para superar los límites naturales de C. Nada mas que eso. Por eso me he extendido en la respuesta.

Un saludo
Callar es asentir ¡No te dejes llevar!

ace332

Ok, no te molestes  ;D. Sin duda alguna será mejor usar una biblicoteca de funciones especializada en el manejo de números grandes para hacer el trabajo que estes haciendo.

Saludos.