Foros del Web » Programación para mayores de 30 ;) » C/C++ »

numeros largos

Estas en el tema de numeros largos en el foro de C/C++ en Foros del Web. A ver si me podeir explicar como funciona este programa, por mas que le doy vueltas no consigo comprenderlo .... este realiza suma de numeros ...
  #1 (permalink)  
Antiguo 19/08/2010, 02:46
 
Fecha de Ingreso: agosto-2010
Mensajes: 3
Antigüedad: 13 años, 8 meses
Puntos: 0
numeros largos

A ver si me podeir explicar como funciona este programa, por mas que le doy vueltas no consigo comprenderlo .... este realiza suma de numeros de asta 100 digitos, y puedes imprimirlo por pantalla como entero,tengo conocimientos basicos de c++.

#include <stdio.h>
#include <math.h>
#include <stdlib.h >

#define MAX 10
#define MAX_LONG 99

struct NumeroLargo
{
int vector[MAX_LONG];
int cantidad;
};
/////////////////////////////////////
void Crear (struct NumeroLargo nlargo[], int ind, int lg)
{
int i;
nlargo[ind].cantidad=lg;
for (i=0; i<lg-1 ; i++)
{
nlargo[ind].vector[i]= rand()%10;
}
nlargo[ind].vector[lg-1]= rand()%9 + 1; //exijo que el ultimo digito sea diferente de 0

}
/////////////////////////////////////////////
void Borrar (struct NumeroLargo nlargo[], int ind)
{
nlargo[ind].cantidad=0;
}
/////////////////////////////////////////////
void Imprimir (struct NumeroLargo nlargo[], int ind)
{
int i, j ;
for(j=0; j<ind ;j++ )
{
printf ("\nNumero %d es: ", j);

for (i=nlargo[j].cantidad-1; i>=0 ; i--)
{
printf ("%1d", nlargo[j].vector[i]);
}
}
}


void ImprimirInt(struct NumeroLargo nlargo[],int ind1){
struct NumeroLargo numerito=nlargo[ind1];
int a=0;
int b=0;
int i,j;

for(i=0;i<numerito.cantidad;i++){
a=numerito.vector[i];
for(j=0;i>j;j++){
a=a*10;
}
b=b+a;
}

printf("El numero en entero es: %d",b);
}


void Sumar (struct NumeroLargo nlargo[], int ind1, int ind2, int ind3){
struct NumeroLargo numero1=nlargo[ind1];
struct NumeroLargo numero2=nlargo[ind2];
struct NumeroLargo resultado;

int a=0;
int i,j;
int acarreo=0;

if (nlargo[ind1].cantidad==nlargo[ind2].cantidad){

for(i=0;i<numero1.cantidad;i++){
j=numero1.vector[i]+numero2.vector[i];
if(acarreo==1){
acarreo=0;
j++;}

if(j<10){
resultado.vector[i]=j;}
else{
acarreo=1;
a=j-10;
resultado.vector[i]=a; }
}

}
else{
printf("\a No puedo sumar estos numeros");}
}
/////////////////////////////////////////////
int menu() {
int op = 0;

printf("\n\nMENU PRINCIPAL:\n\n");

printf("\t1.- Crear Numero Largo (almacenado al reves) \n");
printf("\t2.- Borrar Numero Largo \n");
printf("\t3.- Imprimir una Lista de Numeros Largos\n");
printf("\t4.- Imprimirlo como un Entero \n");
printf("\t5.- Sumar dos Numeros Largos \n");
printf("\tCUALQUIER NUMERO NEGATIVO.- Salir \n");
printf("\nELIJA UNA OPCION:");

scanf("%d", &op);
getchar();
return op;
}
//////////////////////////////////////////

int main(int argc, char *argv[])
{
int i,j;
int indice1, indice2,indice3, longitud;
int op;

struct NumeroLargo numeros[MAX];

// inicialmente borra todos los numeros
for (i=0; i<MAX; i++)
{
Borrar(numeros, i);
}

op = menu();

while (op >=0 )
{
if (op==1)
{
printf ("Dame indice:");
scanf ("%d", &indice1);
printf ("Dame longitug:");
scanf ("%d", &longitud);

if (indice1<0 || indice1 >=MAX || longitud <0 || longitud >MAX_LONG)
printf ("Indice o longitud negativos o mayor que el maximo permitido\n");
else Crear(numeros, indice1, longitud);
}
else if (op==2)
{
printf ("Dame indice:");
scanf ("%d", &indice1);
if (indice1<0 || indice1 >=MAX) printf ("Indice negativos o mayor que el maximo permitido\n");
else Borrar(numeros, indice1);
}
else if (op==3)
{
printf ("Dame indice:");
scanf ("%d", &indice1);
if (indice1<0 || indice1 >=MAX) printf ("Indice negativos o mayor que el maximo permitido\n");
else Imprimir(numeros, indice1);
}
else if (op==4)
{
printf ("Dame indice:");
scanf ("%d", &indice1);
if (indice1<0 || indice1 >=MAX)
{printf ("Indice negativos o mayor que el maximo permitido\n");}
else {ImprimirInt(numeros, indice1);}
}
else if (op==5)
{
printf ("Dame indice 1:");
scanf ("%d", &indice1);

if (indice1<0 || indice1 >=MAX)
{printf ("Indice negativos o mayor que el maximo permitido\n");}
else {
printf("introduce indice 2:");
scanf("%d",&indice2);
if (indice2<0 || indice2 >=MAX)
{printf ("Indice negativos o mayor que el maximo permitido\n");}
else{
printf("¿Donde vas a guardar la suma?:");
scanf("%d",&indice3);
Sumar(numeros,indice1,indice2,indice3);}
}
}

op = menu();
}

return 0;
}
  #2 (permalink)  
Antiguo 19/08/2010, 11:47
 
Fecha de Ingreso: mayo-2008
Ubicación: Chile
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 3
Respuesta: numeros largos

por lo que veo crea un array de 99 enteros (aqui se malgasta memoria, en vez de usar in usaria short o algo que gaste menos memoria, aunque tampoco es de gran importancia)
entonces se accede al numero por sus digitos, por ejemplo no se almacena el 57 como un numero se almacena 5 como decena y 7 como unidad.
Este se debe que al declarar un int, no puedes trabajar con numeros tan grandes, ni si quiea un long long puede almacenar 100 digitos.

Ahora, si no entiendes como funciona el programa sumando, te sugiero que estudies un poco mas el lenguaje c, ya que el codigo no tiene mayores complicaciones.
__________________
si tienes entre 18 y 20 años... entonces tienes 19 años xD
  #3 (permalink)  
Antiguo 19/08/2010, 12:29
 
Fecha de Ingreso: agosto-2010
Mensajes: 3
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: numeros largos

si ... ya comprendo en si el programa ... pero la funcion Sumar no la entiendo ... si me podeis explicar como funciona, tengo conocimientos de c++ basicos
gracias por el aporte
  #4 (permalink)  
Antiguo 19/08/2010, 14:30
 
Fecha de Ingreso: mayo-2008
Ubicación: Chile
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 3
Respuesta: numeros largos

es como cuando sumas en la escuela, si sumas 23 +29 primero sumas el 3 con el 9 y da 12, pero como digito solo dejas el 3 (en el codigo dice que cada vez que el digito suma sea mayor que 10, se le resta 10 y se pasa como reserva) luego sumas 2+2+1(la reserva)
__________________
si tienes entre 18 y 20 años... entonces tienes 19 años xD
  #5 (permalink)  
Antiguo 21/08/2010, 09:36
 
Fecha de Ingreso: agosto-2010
Mensajes: 3
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: numeros largos

tengo una duda : el programa al realizar la suma de dos numeros de igual numero de digitos me pide el indice en el que guardarlo, pero en el momento de imprimir la lista de numeros, no me aparece el resultado de la suma en dicho indice .... y no soy capaz de ver el error
gracias por la ayuda !!!

Etiquetas: numeros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:11.