Created
December 15, 2012 14:18
-
-
Save akahana-1/4295473 to your computer and use it in GitHub Desktop.
授業で作成した多倍長整数(30桁)を計算する電卓
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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