C/Visual C - numeros grandes

 
Vista:

numeros grandes

Publicado por Alberto Menendez Romero (16 intervenciones) el 10/06/2006 17:47:22
Hola a todos..

estoy haciendo unos programillas pero necesito trabajar con numeros demesiados grandes.. y no tipo de datos para ellos...

me han comentado de que realice una clase que maneje los numeros con cadenas de caracteres... para hacer operaciones con ellos...

ya logre realizar la suma... creo que es la mas facil.. pero en verdad no tengo ni idea de como realizar las demas operaciones...

si alguien me puede ayudar con esto... soy nuevo en programacion !!!

le agradeceria que me dieran una idea o me facilitaran el codigo de una clase que maneje numeros grandes con las operaciones elemtales tales como: suma, resta y division..

el codigo en C/C++ si no es mucha molestia.!!!

de antemano muchas gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:numeros grandes

Publicado por fernando.gomez (1603 intervenciones) el 12/06/2006 07:39:54
Hola. Primero que nada, qué tan grande es "grande". ¿Cuántos bytes necesitas?

Los compiladores de hoy en día definen tipos de datos para almacenar números realmente grandes, aunque éstos no son estándares. Por ejemplo, Visual C++ 6 define __int64 como un entero... de 64 bits (de -9223372036854775807 hasta 9223372036854775808). GCC para Unix (Linux, FreeBSD, BSD, etc) define el tipo long long, similar al __int64 de VC6. Ahora, compiladores más recientes -como Visual C++ 8- definen long como un entero de 64 bits...

Ahora, si requieres un número más grande... aquí va la teoría. Asumiento que long sea de 32 bits, si requerimos tener 64 bits, entonces:

long num[2];

es de 64 bits. Así mismo:

long num[4];

es una variable de 128 bits (3.4028236692093846346337460743177e+38 números).

template<int BitSize>
class CBigNumber
{
private:
/* para este ejemplo, empleo unsigned long, puros enteros positivos, para hacer
fácil la explicación */
unsigned long m_vtrNum[BitSize/sizeof(long)];
};

La clase anterior es parametrizada por el número de bits que queremos que contenga la clase. Así:

CBigNumber<128> objNum;

generaría la siguiente clase:

class CBigNumber
{
private:
unsigned long m_vtrNum[4]; // 128 / 32 = 4
};

Ahora bien, ¿de qué sirve tener un vector de longs? Bueno, este algoritmo se basa en números posicionales. m_vtrNum[0] abarca 4294967296 números (vamos a manejar enteros positivos para hacer fácil la explicación). m_vtrNum[1] = 1 sería equivalente a 4294967296 + 1 = 4294967297. Así, si quiero representar el número 4294967300, tendría:

m_vtrNum[0] = 4294967396;
m_vtrNum[1] = 4;

Para representar el número: 8589934692, tendría:

m_vtrNum[0] = 4294967396;
m_vtrNum[1] = 4294967396;
m_vtrNum[2] =100;

¿Se entiende la idea? En este tenor, tendrías que sobrecargar los operadores aritméticos (y de asignación, comparasión, desigualdades, etc).

A final de cuentas, el resultado que tengas se deberá -tarde que temprano- representar como una cadena de texto, por lo que tendrás que proporcionar un método (i.e. ToString y sobrecargar el operador de conversión string()) para que haga dicha representación. Pero la idea es la anterior.

Esto es mucho más eficiente que tener una cadenota de caracteres, y es el algoritmo que emplean programas de cálculo científico.

Espero te haya quedado claro más o menos lo que hay que hacer.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:numeros grandes

Publicado por Alberto Menendez Romero (16 intervenciones) el 12/06/2006 22:06:09
Hola fernando.gomez

Muy buena tu explicacion, en verdad no tenia ni idea de como comenzar a procesar todos esos numeros... muchisima gracias por tu codigo...

veamos si ahora puedo procesar numeros grandes de hasta 100 000 de digitos.

saludos..y gracias por todo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar