| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- Const
- file1 = 'Num1.txt';
- file2 = 'num2.txt';
- result = 'Res.txt';
- max = 4000;
- n : word = 17;
- Type
- TM = array [0..max] of 0..9;
- PM = ^TM;
- Var
- i,j,b,a :word;
- tmp1,tmp2 :word;
- modcur :word;
- modmain :word;
- f1 : PM;
- f2 : PM;
- umn : array [1..max] of integer;
- res : PM;
- {----------------------------------------------}
- Function Length3(res:PM):word;
- Var
- i : word;
- Begin
- i := max-1;
- While res^[i] = 0 do dec(i);
- length3 := i;
- End;{Length3}
- {-----------------------------------------------------------------------}
- Function getwrite(inp : integer):byte;
- Var
- st : string;
- code : integer;
- rc : integer;
- Begin
- str(inp,st);
- val(st[length(st)],rc,code);
- GetWrite := rc;
- End;{GetWrite}
- {----------------------------------------------}
- Function GetMemory(inp : integer) : integer;
- Var
- code : integer;
- st : string;
- rc : integer;
- Begin
- if inp >9 then begin
- Str(inp,st);
- delete(st,length(st),1);
- val(st,rc,code);
- GetMemory := rc;
- end
- else GetMemory :=0;
- End;{GetMemory}
- {----------------------------------------------}
- Procedure Mult(F1,F2:PM;var RES:TM);
- Begin
- modmain:=0;
- modcur:=0;
- for i := 0 to length3(f2) do
- begin
- modcur := 0;
- for j := 0 to length3(f1) do
- begin
- tmp1 := f2^[i]*f1^[j]+modcur;
- modcur := getmemory(tmp1);
- tmp2 := modmain+res[i+j]+getwrite(tmp1);
- res[i+j] := getwrite(tmp2);
- modmain := getmemory(tmp2)
- end;
- a := i+j+1;
- b := modcur;
- repeat
- tmp1 := getwrite(b)+modmain;
- res[a] := getwrite(tmp1);
- modmain := getmemory(tmp1);
- inc(a);
- b := getmemory(b)
- until getmemory(b) = 0;
- end;
- End;{Multiply}
- {----------------------------------------}
- Procedure WriteRes(Re:PM);
- Var
- i : word;
- f : text;
- Begin
- if ParamCount = 3 then Assign(f,ParamStr(3))
- else Assign(f,result);
- Rewrite(f);
- for i := length3(re) downto 0 do
- Write(f,re^[i]);
- Close(f);
- End;{WriteRes}
- {-----------------------------------------}
- Procedure _2VN(var FI:TM;st:word);
- var i:word;
- ret,ret2,ret3:TM;
- Begin
- fillchar(ret,MAX,0);
- fillchar(ret2,MAX,0);
- fillchar(ret3,MAX,0);
- ret[0] := 2;
- ret3[0] := 2;
- for i := 2 to st do
- begin
- fillchar(ret2,max,0);
- MULT(@ret,@ret3,ret2);
- ret:=ret2;
- end;
- FI := Ret;
- End;
- {-----------------------------------------}
- Var
- cur : word;
- p,ost : word;
- Begin
- Write('‚¢¥¤¨â¥ á⥯¥ì ¤¢®©ª¨: ');
- Read(n);
- New(F1);
- New(F2);
- New(Res);
- fillchar(F1^,MAX,0);
- fillchar(F2^,MAX,0);
- fillchar(Res^,MAX,0);
- fillchar(umn,MAX,1);
- cur := 1;
- p := 1;
- while cur+cur < n do
- begin
- cur := cur+cur;
- umn[p] := -1;
- inc(p);
- end;
- ost := n - cur;
- repeat
- cur := 1;
- while cur+cur <= ost do cur := cur+cur;
- ost := ost - cur;
- umn[p] := cur;
- inc(p);
- until ost = 0;
- { readfile;}
- WriteLn('� ç¨ ¥¬ à ¡®âã');
- F1^[0]:=2;
- for cur := 1 to p-1 do
- begin
- if umn[cur] = -1 then
- begin
- fillchar(res^,max,0);
- MULT(F1,F1,Res^)
- end
- else
- begin
- _2VN(F2^,umn[cur]);
- fillchar(res^,max,0);
- MULT(F1,F2,Res^)
- end;
- F1^:=RES^;
- end;
- WriteLn('� ¡®â ®ª®ç¥ !!!');
- WriteRes(Res);
- Dispose(F1);
- Dispose(F2);
- Dispose(Res);
- End.
|