MULTIPLY.PAS 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. Const
  2. file1 = 'Num1.txt';
  3. file2 = 'num2.txt';
  4. result = 'Res.txt';
  5. max = 1000;
  6. Type
  7. TM = array [0..max] of 0..9;
  8. TR = array [0..2*max] of 0..9;
  9. Var
  10. f1 : ^TM;
  11. f2 : ^TM;
  12. length1 : word;
  13. length2 : word;
  14. res : ^TR;
  15. {-----------------------------------------------------------------------}
  16. Procedure ReadFile;
  17. Var
  18. f : file of char;
  19. name : string;
  20. uze : boolean;
  21. i : word;
  22. j : word;
  23. ch : char;
  24. Begin
  25. for j := 0 to max do f1^[j] := 0;
  26. for j := 0 to max do f2^[j] := 0;
  27. for j := 0 to 2*max do res^[j] := 0;
  28. if ParamCount >= 2 then Assign(f,paramstr(1))
  29. else Assign(f,file1);
  30. {$I-}
  31. Reset(f);
  32. if IOResult <> 0 then
  33. Begin
  34. WriteLn;
  35. repeat
  36. Write('Неверное имя 1 - го фаила, введите новое: ');
  37. Readln(name);
  38. Assign(f,name);
  39. Reset(f);
  40. until IOResult = 0;
  41. End;
  42. {$I+}
  43. uze := false;
  44. length1 := 0;
  45. seek(f,filesize(f)-1);
  46. repeat
  47. Read(f,ch);
  48. if ch in ['0'..'9'] then
  49. begin
  50. f1^[length1] := ord(ch) - $30;
  51. inc(length1);
  52. end;
  53. if Filepos(F)=1 then uze:=true;
  54. seek(F,filepos(f)-2);
  55. until uze;
  56. Close(f);
  57. if ParamCount >= 2 then Assign(f,paramstr(2))
  58. else Assign(f,file2);
  59. {$I-}
  60. Reset(f);
  61. if IOResult <> 0 then
  62. Begin
  63. WriteLn;
  64. repeat
  65. Write('Неверное имя 2 - го фаила, введите новое: ');
  66. Readln(name);
  67. Assign(f,name);
  68. Reset(f);
  69. until IOResult = 0;
  70. End;
  71. {$I+}
  72. length2 := 0;
  73. seek(f,filesize(f)-1);
  74. uze := false;
  75. repeat
  76. Read(f,ch);
  77. if ch in ['0'..'9'] then
  78. begin
  79. f2^[length2] := ord(ch) - $30;
  80. inc(length2);
  81. end;
  82. if Filepos(F)=1 then uze:=true;
  83. seek(F,filepos(f)-2);
  84. Until uze;
  85. Close(f);
  86. End;
  87. {----------------------------------------------}
  88. Function getwrite(inp : integer):byte;
  89. Var
  90. st : string;
  91. code : integer;
  92. rc : integer;
  93. Begin
  94. str(inp,st);
  95. val(st[length(st)],rc,code);
  96. GetWrite := rc;
  97. End;{GetWrite}
  98. {----------------------------------------------}
  99. Function GetMemory(inp : integer) : integer;
  100. Var
  101. code : integer;
  102. st : string;
  103. rc : integer;
  104. Begin
  105. if inp >9 then begin
  106. Str(inp,st);
  107. delete(st,length(st),1);
  108. val(st,rc,code);
  109. GetMemory := rc;
  110. end
  111. else GetMemory :=0;
  112. End;{GetMemory}
  113. {----------------------------------------------}
  114. Procedure Multiply(F1,F2:TM;var RES:TR;Length1,Length2:word);
  115. Var
  116. i,j,b,a :word;
  117. tmp1,tmp2 :word;
  118. modcur :word;
  119. modmain :word;
  120. Begin
  121. modmain:=0;
  122. modcur:=0;
  123. for i := 0 to length2-1 do
  124. begin
  125. modcur := 0;
  126. for j := 0 to length1-1 do
  127. begin
  128. tmp1 := f2[i]*f1[j]+modcur;
  129. modcur := getmemory(tmp1);
  130. tmp2 := modmain+res[i+j]+getwrite(tmp1);
  131. res[i+j] := getwrite(tmp2);
  132. modmain := getmemory(tmp2)
  133. end;
  134. a := i+j+1;
  135. b := modcur;
  136. repeat
  137. tmp1 := getwrite(b)+modmain;
  138. res[a] := getwrite(tmp1);
  139. modmain := getmemory(tmp1);
  140. inc(a);
  141. b := getmemory(b)
  142. until getmemory(b) = 0;
  143. end;
  144. End;{Multiply}
  145. {----------------------------------------------}
  146. Function Length3(res:TR;M:word):word;
  147. Var
  148. i : word;
  149. Begin
  150. i := m;
  151. While res[i] = 0 do dec(i);
  152. length3 := i;
  153. End;{Length3}
  154. {----------------------------------------}
  155. Procedure WriteRes(Re:TR);
  156. Var
  157. i : word;
  158. f : text;
  159. Begin
  160. if ParamCount = 3 then Assign(f,ParamStr(3))
  161. else Assign(f,result);
  162. Rewrite(f);
  163. for i := length3(re,2*MAX) downto 0 do
  164. Write(f,re[i]);
  165. Close(f);
  166. End;{WriteRes}
  167. {-----------------------------------------}
  168. Begin
  169. New(F1);
  170. New(F2);
  171. New(Res);
  172. fillchar(F1^,MAX,0);
  173. fillchar(F2^,MAX,0);
  174. fillchar(Res^,MAX*2,0);
  175. { readfile;}
  176. F1^[0]:=2;
  177. Multiply(F1^,F1^,RES^,1,1);
  178. WriteRes(Res^);
  179. Dispose(F1);
  180. Dispose(F2);
  181. Dispose(Res);
  182. End.