Skip to content

Instantly share code, notes, and snippets.

@akahana-1
Created December 15, 2012 14:18
Show Gist options
  • Save akahana-1/4295473 to your computer and use it in GitHub Desktop.
Save akahana-1/4295473 to your computer and use it in GitHub Desktop.
授業で作成した多倍長整数(30桁)を計算する電卓
program calc(input,output);
const DIGIT = 30;
type ary = array[0..DIGIT-1] of integer;
var a,b,c:ary; op:char;
procedure InputNum(var a:ary);
var ch:char;
i:integer;
begin
for i := 0 to DIGIT-1 do
begin;
read(ch);
a[i] := ord(ch) - ord('0');
end;
readln();
end;
function DigitFind(a:ary):integer;
var i:integer;f:boolean;
begin
f := true;
for i := 0 to DIGIT-1 do
if(a[i] <> 0) and f then
begin
f := false;
DigitFind := DIGIT - i;
end;
end;
function MinFind(a:ary):boolean;
var i:integer;f:boolean;
begin
f := false;
for i := 0 to DIGIT-1 do
begin
if(a[i] < 0) then
begin
f := true;
break;
end;
end;
MinFind := not f;
end;
procedure OutputNum(a:ary);
var i:integer;
begin
for i := 0 to DIGIT-1 do
write(a[i]);
writeln();
end;
procedure CopyArray(now:integer; var origin,obj:ary);
begin
obj[now] := origin[now];
origin[now] := 0;
if (now - 1 > -1) then CopyArray(now - 1,origin,obj);
end;
procedure Add(a,b:ary;now:integer; var res:ary);
begin
res[now] := res[now] + a[now] + b[now];
if((res[now] div 10 > 0) and (now - 1 > -1)) then
begin
res[now - 1] := res[now - 1] + (res[now] div 10);
res[now] := res[now] - ((res[now] div 10) * 10);
end;
if(now - 1 > -1) then Add(a,b,now-1,res);
end;
procedure SubTrac(a,b:ary;now:integer; var res:ary);
begin
// OutputNum(res);
// writeln(a[now],' ',b[now],' ',res[now]);
res[now] := a[now] - b[now] - res[now];
// writeln(res[now]);
if((res[now] < 0) and (now - 1 > -1)) then
begin
res[now-1] := res[now-1] + 1;
res[now] := res[now] + 10;
end;
if(now - 1 > -1) then SubTrac(a,b,now-1,res);
end;
procedure MulTrac(a,b:ary;now:integer; var res:ary);
var i,j:integer;
begin
i := DIGIT - 1;
j := now;
while((i > -1) and (now > -1)) do
begin
res[j] := res[j] + (b[now] * a[i]);
if((res[j] div 10 > 0) and (j - 1 > -1)) then
begin
res[j - 1] := res[j - 1] + (res[j] div 10);
res[j] := res[j] - ((res[j] div 10) * 10);
end;
i := i - 1;
j := j - 1;
end;
if(now - 1 > -1) then Multrac(a,b,now-1,res)
end;
procedure Division(a,b:ary; var res:ary);
var adig,bdig,i,j,count,n:integer;
ans:ary;
begin
adig := DigitFind(a);
bdig := DigitFind(b);
CopyArray(DIGIT-1,ans,ans);
if (adig >= bdig) then
begin
for i := (adig - bdig) to DIGIT-1 do
b[i - (adig - bdig)] := b[i];
for i := 1 to (adig - bdig) do
b[DIGIT - i] := 0;
n := adig - bdig;
for i := n downto 0 do
begin
count := 0;
// writeln('digit',' ',adig,' ',bdig,' ',i);
// writeln(now);
// OutputNum(a);
// OutputNum(b);
// OutputNum(res);
SubTrac(a,b,(DIGIT-1),ans);
// OutputNum(ans);
while(MinFind(ans)) do
begin
// OutputNum(ans);
// writeln('t');
CopyArray(DIGIT-1,ans,a);
count := count + 1;
SubTrac(a,b,(DIGIT-1),ans);
end;
// OutputNum(a);
// writeln(res[DIGIT+now]);
// if(res[DIGIT+now] div 10 > 0) then
// begin
// res[DIGIT+now-1] := res[DIGIT+now] div 10;
// res[DIGIT+now] := res[DIGIT+now] mod 10;
// end;
if count > 0 then res[DIGIT-(i+1)] := count;
for j := DIGIT-1 downto 1 do
begin
b[j] := b[j-1];
end;
b[0] := 0;
CopyArray(DIGIT-1,ans,ans);
end;
end;
end;
begin
InputNum(a);
readln(op);
while (op <> '=') do
begin
InputNum(b);
if(op = '+') then Add(a,b,DIGIT-1,c)
else if(op = '-') then SubTrac(a,b,DIGIT-1,c)
else if(op = '*') then MulTrac(a,b,DIGIT-1,c)
else if(op = '/') then Division(a,b,c);
CopyArray(DIGIT-1,c,a);
OutputNum(a);
readln(op);
end;
OutputNum(a);
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment