Pascal/Turbo Pascal - Calculadora Numeros grandes

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 20 puestos en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

Calculadora Numeros grandes

Publicado por JP (1 intervención) el 09/12/2018 15:29:12
Se pide implementar un programa que realice una serie de operaciones binarias con dos “numeros enteros muy grandes” x e y, que puedan contener hasta 50 dıgitos. Estos se especificaran de la misma manera que los numeros enteros en Pascal (el diagrama sintactico es el mismo que para el tipo integer).
Descripcion de la entrada

La primera lınea contiene un caracter que indica la operacion a realizar. Los caracteres posibles son, junto con la operacion a realizar son:
+ : suma
- : resta
* : multiplicacion

La segunda lınea contiene x, y la tercera y. Todas las lıneas terminan en un salto de lınea.

Es en Pascal. He logrado leer los array pero no se realizar las operaciones
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

Calculadora Numeros grandes

Publicado por Juan Martín Aguado (1 intervención) el 04/01/2019 11:15:52
No te sé contestar, pero podrías pasar como has conseguido leer los números? gracias un saludo
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

Calculadora Numeros grandes

Publicado por Pablo (1 intervención) el 02/11/2019 01:21:35
Por si alguno llega aquí buscando algo similar...
Defines un tipo de datos digito= 0..9 y otro para los 3 arrays.
var car : char, dig : digito
Para leer los números largos puedes completar los arrays de a un dígito por lugar teniendo cuidado que al final del proceso queden alineados a la derecha del array.
Debes considerar el largo útil de cada array en otra variable.
En mi caso no pude leer los dígitos como número, entonces usas while not eoln ... read(variable_char)
val(caracter, digito,variablenumerica) y ese valor lo vas cargando en el array.

La operación finalmente se hace índice a índice de ambos arrays como usando lápiz y papel.

Debajo va una parte de esto; faltarían los subp de resta y multiplicación

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
program sumarenteros;
 
CONST
	MaxDig = 100;
TYPE
   Digito = 0..9;
   Natural = RECORD
               digitos : ARRAY[1..MaxDig] OF Digito;
               tope : 0..MaxDig;
             END;
 
var num1, num2,total : Natural;
dig : digito;
chardig : char;
num : digito;
valorerrorchardig : 0..maxdig;
 
 
{Val(CAd,num,código)}
label reiniciar;
 
 
procedure cargarvalor(var numero:Natural);
var count :0..maxdig;
 
 
begin
count := 0;
writeln('Ingrese un natural de hasta ',maxdig-1:2,' dígitos:');
readln(dig);
	while (count<maxdig)and (not eoln) do
	begin
	count := count +1;
	{read(chardig);}
	{read(dig);}
	{val(chardig,num,valorerrorchardig);}
	{numero.digitos[count]:=num;}
	numero.digitos[count]:=dig;
	numero.tope:= count
	end;
 
	{readln();}
	for count:= 1 to numero.tope do
		numero.digitos[maxdig-count+1]:= numero.digitos[numero.tope-count+1];
	numero.tope:= maxdig - numero.tope +1;
end;
 
procedure igualarlargos(var numero1, numero2 : natural);
 
begin
if numero1.tope<>numero2.tope then
begin
if numero1.tope<numero2.tope then
	while numero2.tope>numero1.tope do
	begin
	numero2.tope:=numero2.tope-1;
	numero2.digitos[numero2.tope]:=0;
	end
	else
	while numero1.tope>numero2.tope do
	begin
	numero1.tope:=numero1.tope-1;
	numero1.digitos[numero1.tope]:=0;
	end
 
end
end;
 
 
procedure sumarnaturales(numero1,numero2: Natural; var total : Natural);
 
var mellevo : digito;
 
count, suma : 1..maxdig;
 
 
 
begin
 
mellevo:= 0;
 
for count:= maxdig downto numero1.tope do
 
    begin
 
    total.digitos[count]:= (numero1.digitos[count]+numero2.digitos[count] + mellevo) mod 10;
 
    mellevo := (numero1.digitos[count]+numero2.digitos[count] + mellevo) div 10;
 
    end;
 
if mellevo= 1 then
 
begin
 
total.digitos[numero1.tope-1]:=1;
 
total.tope:= numero1.tope-1
 
end
 
else
 
total.tope:= numero1.tope;
 
 
 
end;
 
 
 
procedure mostrar(numero1 : Natural);
 
var count:1..maxdig;
 
begin
 
for count := numero1.tope to maxdig do
 
write(numero1.digitos[count]:0);
 
writeln();
 
end;
 
begin
reiniciar:
cargarvalor(num1);
cargarvalor(num2);
mostrar(num1);
igualarlargos(num1,num2);
sumarnaturales(num1,num2,total);
mostrar(total);
 
end.
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