| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- Const
- file1 = 'Num1.txt';
- file2 = 'num2.txt';
- result = 'Res.txt';
- max = 1000;
- Type
- TM = array [0..max] of 0..9;
- TR = array [0..2*max] of 0..9;
- Var
- f1 : ^TM;
- f2 : ^TM;
- length1 : word;
- length2 : word;
- res : ^TR;
- {-----------------------------------------------------------------------}
- Procedure ReadFile;
- Var
- f : file of char;
- name : string;
- uze : boolean;
- i : word;
- j : word;
- ch : char;
- Begin
- for j := 0 to max do f1^[j] := 0;
- for j := 0 to max do f2^[j] := 0;
- for j := 0 to 2*max do res^[j] := 0;
- if ParamCount >= 2 then Assign(f,paramstr(1))
- else Assign(f,file1);
- {$I-}
- Reset(f);
- if IOResult <> 0 then
- Begin
- WriteLn;
- repeat
- Write('Неверное имя 1 - го фаила, введите новое: ');
- Readln(name);
- Assign(f,name);
- Reset(f);
- until IOResult = 0;
- End;
- {$I+}
- uze := false;
- length1 := 0;
- seek(f,filesize(f)-1);
- repeat
- Read(f,ch);
- if ch in ['0'..'9'] then
- begin
- f1^[length1] := ord(ch) - $30;
- inc(length1);
- end;
- if Filepos(F)=1 then uze:=true;
- seek(F,filepos(f)-2);
- until uze;
- Close(f);
- if ParamCount >= 2 then Assign(f,paramstr(2))
- else Assign(f,file2);
- {$I-}
- Reset(f);
- if IOResult <> 0 then
- Begin
- WriteLn;
- repeat
- Write('Неверное имя 2 - го фаила, введите новое: ');
- Readln(name);
- Assign(f,name);
- Reset(f);
- until IOResult = 0;
- End;
- {$I+}
- length2 := 0;
- seek(f,filesize(f)-1);
- uze := false;
- repeat
- Read(f,ch);
- if ch in ['0'..'9'] then
- begin
- f2^[length2] := ord(ch) - $30;
- inc(length2);
- end;
- if Filepos(F)=1 then uze:=true;
- seek(F,filepos(f)-2);
- Until uze;
- Close(f);
- End;
- {----------------------------------------------}
- 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 Multiply(F1,F2:TM;var RES:TR;Length1,Length2:word);
- Var
- i,j,b,a :word;
- tmp1,tmp2 :word;
- modcur :word;
- modmain :word;
- Begin
- modmain:=0;
- modcur:=0;
- for i := 0 to length2-1 do
- begin
- modcur := 0;
- for j := 0 to length1-1 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}
- {----------------------------------------------}
- Function Length3(res:TR;M:word):word;
- Var
- i : word;
- Begin
- i := m;
- While res[i] = 0 do dec(i);
- length3 := i;
- End;{Length3}
- {----------------------------------------}
- Procedure WriteRes(Re:TR);
- Var
- i : word;
- f : text;
- Begin
- if ParamCount = 3 then Assign(f,ParamStr(3))
- else Assign(f,result);
- Rewrite(f);
- for i := length3(re,2*MAX) downto 0 do
- Write(f,re[i]);
- Close(f);
- End;{WriteRes}
- {-----------------------------------------}
- Begin
- New(F1);
- New(F2);
- New(Res);
- fillchar(F1^,MAX,0);
- fillchar(F2^,MAX,0);
- fillchar(Res^,MAX*2,0);
- { readfile;}
- F1^[0]:=2;
- Multiply(F1^,F1^,RES^,1,1);
- WriteRes(Res^);
- Dispose(F1);
- Dispose(F2);
- Dispose(Res);
- End.
|