SCAR Code:
program New;
const
Lo = 1;
Hi = 1000;
type
TBigNum = array[Lo..Hi] of Byte;
var
APow: array[0..10] of Integer;
procedure InitPow;
var
i: Integer;
begin
for i := 0 to 10 do
APow[i] := Round(Pow(10, i));
end;
procedure ResetBigNum(var BigNum: TBigNum);
var
i: Integer;
begin
for i := Lo to Hi do
BigNum[i] := 0;
end;
function CopyBigNum(BigNum: TBigNum): TBigNum;
var
i: Integer;
begin
for i := Lo to Hi do
Result[i] := BigNum[i];
end;
function IntToBigNum(Int: Integer): TBigNum;
var
i, c: Integer;
begin
ResetBigNum(Result);
for i := High(APow) downto 0 do
if (Int >= APow[i]) then
begin
c := Floor(Int / Extended(APow[i]));
Result[Hi - i] := c;
Int := Int mod APow[i];
end;
end;
function BigNumToString(Num: TBigNum): string;
var
i: Integer;
Start: Boolean;
begin
Result := '';
for i := Lo to Hi do
begin
if (not Start) then
Start := (Num[i] > 0);
if Start then
Result := Result + IntToStr(Num[i]);
end;
if (not Start) then
Result := '0';
end;
procedure PrintBigNum(Num: TBigNum);
begin
WriteLn(BigNumToString(Num));
end;
procedure SetBigIndex(var Base: TBigNum; Val: Integer; Index: Integer);
var
i: Integer;
begin
if (Val >= 0) and (Val < 10) then
begin
Base[Index] := Val;
Exit;
end;
for i := High(APow) downto 1 do
if (Val >= APow[i]) then
begin
if ((Index - i) >= Lo) then
SetBigIndex(Base, Base[Index - i] + (Val div APow[i]), Index - i);
Val := (Val mod APow[i]);
end
else if (Val <= -APow[i - 1]) then
begin
if ((Index - i) >= Lo) then
begin
SetBigIndex(Base, Base[Index - i] - Max((Val div APow[i]), 1), Index - i);
end;
Val := (Val + 10) mod APow[i];
end;
Base[Index] := iAbs(Val);
end;
procedure BigAddIntAt(var Base: TBigNum; Add, Index: Integer);
var
bAdd: TBigNum;
i: Integer;
begin
bAdd := IntToBigNum(iAbs(Add));
for i := High(APow) downto 0 do
if (Add > 0) then
SetBigIndex(Base, Integer(Base[Index - i]) + Integer(bAdd[Hi - i]), Index - i)
else
SetBigIndex(Base, Integer(Base[Index - i]) - Integer(bAdd[Hi - i]), Index - i);
end;
procedure BigAdd(var Base: TBigNum; Add: TBigNum);
var
i: Integer;
begin
for i := Lo to Hi do
SetBigIndex(Base, Integer(Base[i]) + Integer(Add[i]), i);
end;
procedure BigSubtract(var Base: TBigNum; Subtract: TBigNum);
var
i: Integer;
begin
for i := Lo to Hi do
SetBigIndex(Base, Integer(Base[i]) - Integer(Subtract[i]), i);
end;
procedure BigMulitply(var Base: TBigNum; n: Integer);
var
i: Integer;
begin
for i := Lo to Hi do
SetBigIndex(Base, Integer(Base[i]) * n, i);
end;
function BigDivMod(Num: TBigNum; n: Integer; out AMod, AModIndex: Integer): TBigNum;
var
i, ii,
b, Index,
c: Integer;
Base: TBigNum;
begin
ResetBignum(Result);
Base := CopyBigNum(Num);
AMod := 0;
AModIndex := Lo;
if (n < 1) then
begin
WriteLn('Can''t divide by zero!');
Exit;
end;
for i := Lo to Hi do
if (Base[i] > 0) then
begin
b := 0;
ii := 0;
while (b < n) and (ii + i <= Hi) do
begin
b := (b * 10) + Base[ii + i];
Inc(ii);
end;
if (b > n) then
begin
c := Floor(Extended(b) / n);
Index := i + Length(IntToStr(b)) - 1;
if (c > 0) then
begin
BigAddIntAt(Result, c, Index);
BigAddIntAt(Base, -(c * n), Index);
end;
//Continue;
end
else
begin
AMod := b;
AModIndex := i + Length(IntToStr(b)) - 1;
end;
end;
end;
function BigDivide(Num: TBigNum; n: Integer): TBigNum;
var
AMod, AModIndex: Integer;
begin
Result := BigDivMod(Num, n, AMod, AModIndex);
if (AMod > 0) then
BigAddIntAt(Result, Round(Extended(AMod) / n), AModIndex);
end;
function BigMod(Num: TBigNum; n: Integer): Integer;
var
i: Integer;
begin
BigDivMod(Num, n, Result, i);
end;
function BigPower(b, g: Integer): TBigNum;
var
i: Integer;
begin
Result := IntToBigNum(1);
for i := 1 to g do
BigMulitply(Result, b);
end;
function BigFactorial(n: Integer): TBigNum;
var
i: Integer;
begin
Result := IntToBigNum(1);
for i := 2 to n do
BigMulitply(Result, i);
end;
function BigSum(Num: TBigNum): Integer;
var
i: Integer;
begin
Result := 0;
for i := Lo to Hi do
Result := Result + Num[i];
end;
var
F1, F2, R: TBigNum;
s: string;
begin
ClearDebug;
InitPow;
F1 := IntToBigNum(0);
F2 := IntToBigNum(1);
ResetBigNum(R);
while (Length(s) < Hi) do
begin
R := F1;
BigAdd(R, F2);
Swap(R, F2);
Swap(R, F1);
s := BigNumToString(R);
WriteLn(s);
end;
end.