• Jueves 14 de Noviembre de 2024, 23:05

Autor Tema:  SUMAR NATURALES DE HASTA 100 DIGITOS  (Leído 2352 veces)

blaise_pablitus

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
SUMAR NATURALES DE HASTA 100 DIGITOS
« en: Lunes 4 de Enero de 2010, 22:08 »
0
:hola: Queridos colegas  "Pascaleros", quisiera compartir con uds. el código de un programa que estuve escribiendo: es un programa que permite sumar dos numeros naturales de hasta cien dígitos (recordemos que el entero mas grande que se puede representar directamente es 65536, o algo así), bueno, aquí va la letra del ejercicio y el código que escribí:

" Se desea trabajar con una aritmética de Naturales de hasta 100 dígitos. Los enteros de Pascal no soportan dicha aritmética, por lo que se piensa utilizar la siguiente representación de Naturales basada en arreglos con tope:

CONST
        MaxDig = 100;
TYPE
     Digito = 0..9;
     Natural = RECORD
                             digitos : ARRAY [1..MaxDig] OF Digito;
                             tope : 0..MaxDig;
                   END;

Escribir un programa que lleve a cabo la suma de naturales en terminos de la estructura anterior.

Código: Pascal
  1. (* Programa que permite sumar numeros naturales de hasta cien dígitos de longitud *)
  2. (* utilizando un array con tope *)
  3.  
  4. PROGRAM Aritnat(input,output);
  5.  
  6. CONST
  7.     MaxDig = 100;  (* Constante que indica longitud maxima del numero *)
  8.  
  9. TYPE
  10.    Digito = 0..9;  (* en cada celda del array se introducirán digitos del cero al nueve *)
  11.    Natural = RECORD
  12.                   digitos: ARRAY [1..MaxDig] OF Digito;
  13.                   tope: 0..MaxDig;
  14.              END;
  15. VAR
  16.   a, b, c:Natural;   (* a y b son los sumandos, c es el resultado de la suma *)
  17.   suma, acarreo, i, digit:integer;  (* Variables para procesar los datos *)
  18.   temp:integer;
  19.  
  20.  
  21. BEGIN
  22.  
  23.     (* Lectura de los números a sumar *)
  24.     writeln('Ingrese el primer numero:');
  25.    
  26.     readln(digit); (* Se ingresa el primer digito *)
  27.     a.tope := 0;   (* Se inicializa el tope *)
  28.     WHILE (digit IN [0..9]) AND ((a.tope < MaxDig) OR (a.tope = MaxDig)) DO
  29.          BEGIN   (* Mientras el digito que se ingrese pertenesca al subrango 0..9 y mientras no se haya terminado el array *)
  30.              a.tope := a.tope + 1;     (* Se incrementa en uno el tope del array *)
  31.              a.digitos[a.tope] := digit;  (* Se almacena el digito en la celda correspondiente *)
  32.              readln(digit)             (* Se lee el siguiente digito *)
  33.          END;
  34.  
  35.  
  36.     (* se solicita ingresar el segundo numero *)
  37.  
  38.     writeln('Ingrese el segundo numero:');
  39.     readln(digit);   (* Se lee el primer digito *)
  40.     b.tope := 0;     (* Se inicializa el tope *)
  41.     WHILE (digit IN [0..9]) AND ((b.tope < MaxDig) OR (b.tope = MaxDig)) DO
  42.          BEGIN     (* Mientras pertenesca al intervalo 0..9 y no se termine el array *)
  43.              b.tope := b.tope + 1;  (* Se incrementa el tope *)
  44.              b.digitos[b.tope] := digit;    (* Se almacena el digito en la celda correspondiente *)
  45.              readln(digit)              (* Se lee el siguiente digito *)
  46.          END;
  47.  
  48.  
  49.     (* Si un array tiene mas digitos que otro, entonces al que tiene menos hay que agregarle ceros al principio *)
  50.     (* Hasta que ambos tengan la misma longitud, de esa manera la suma se hará con mayor facilidad *)
  51.  
  52.     IF (a.tope > b.tope) THEN BEGIN
  53.        FOR i := b.tope DOWNTO 1 DO BEGIN
  54.            temp := b.digitos[i+(a.tope-b.tope)];
  55.            b.digitos[i+(a.tope-b.tope)] := b.digitos[i];
  56.            b.digitos[i] := temp;
  57.            b.tope := b.tope + (a.tope - b.tope);
  58.            END; (* FOR *)
  59.        FOR i := 1 TO (a.tope - b.tope) DO
  60.            b.digitos[i] := 0;
  61.        END   (* if *)
  62.        ELSE IF (b.tope > a.tope) THEN BEGIN
  63.                FOR i := a.tope DOWNTO 1 DO BEGIN
  64.                    temp := a.digitos[i+(b.tope-a.tope)];
  65.                    a.digitos[i+(b.tope-a.tope)] := a.digitos[i];
  66.                    a.digitos[i] := temp;
  67.                    a.tope := a.tope + (b.tope-a.tope);
  68.                    END;   (* FOR *)
  69.                FOR i := 1 TO (b.tope - a.tope) DO
  70.                    a.digitos[i] := 0;
  71.                END; (* ELSE IF *)
  72.    
  73.     c.tope := 0;
  74.     FOR i := 1 TO (a.tope) DO BEGIN
  75.         c.tope := c.tope + 1;
  76.         c.digitos[i] := 0
  77.         END;
  78.  
  79.     (* Ahora se le indicará a la máquina que sume los arreglos a y b como lo hacíamos en la escuela: digito a digito *)
  80.     (* empezando por las unidades y de derecha a izquierda *)
  81.     (* hay que considerar también el acarreo de las decenas, que por defecto, *)
  82.     (* se inicializa en cero *)
  83.  
  84.     acarreo := 0;
  85.     FOR i := (a.tope) DOWNTO 1 DO BEGIN
  86.         suma := a.digitos[i] + b.digitos[i] + acarreo;
  87.         IF (i = 1) AND (suma DIV 10 = 1) THEN BEGIN  (* caso excepcional: si al sumar el primer digito de a con el de b, el resultado es 10 o más, *)
  88.            c.digitos[c.tope+1] := c.digitos[c.tope];  (* entonces, al array c se le agrega una cifra más al principio: la cifra del acarreo *)
  89.            c.tope := c.tope + 1;
  90.            c.digitos[2] := suma MOD 10;
  91.            c.digitos[1] := suma DIV 10
  92.         END (* IF *)
  93.         ELSE BEGIN   (* sino, entonces sumamos cifra con cifra y almacenamos las unidades en la celda del array c, y las decenas que sobren en acarreo *)
  94.                  c.digitos[i] := suma MOD 10;
  95.                  acarreo := suma DIV 10
  96.              END;  (* ELSE *)
  97.         END;  (* FOR *)
  98.  
  99.     (* Para terminar, mostramos el resultado de la suma en pantalla *)
  100.     FOR i := 1 TO (c.tope) DO
  101.         write(c.digitos[i]);
  102.    
  103.     readln(i);
  104.  
  105. END.
  106.  
:rolleyes: Bueno, este código me funcionó, pero me gustaría saber si uds. piensan que es una buena forma de programar o si hay cosas que se pueden mejorar u obviar...Ah! Me olvido de decirles que yo programo en free pascal 2.2.2.
  :good: Saludos