NVN.PAS 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. Const
  2. { file1 = 'Num1.txt';
  3. file2 = 'num2.txt';}
  4. result = 'Res.txt';
  5. max = 5000;
  6. n : word = 17;
  7. Type
  8. TM = array [0..max] of 0..9;
  9. PM = ^TM;
  10. Var
  11. i,j,b,a :word;
  12. tmp1,tmp2 :word;
  13. modcur :word;
  14. modmain :word;
  15. f1 : PM;
  16. f2 : PM;
  17. umn : array [1..max] of integer;
  18. res : PM;
  19. {----------------------------------------------}
  20. Function Length3(res:PM):word;
  21. Var
  22. i : word;
  23. Begin
  24. i := max-1;
  25. While res^[i] = 0 do dec(i);
  26. length3 := i;
  27. End;{Length3}
  28. {-----------------------------------------------------------------------}
  29. Procedure MakeLong(var Long:TM;va:word);
  30. var st : string;i : word;
  31. Begin
  32. Str(va,st);
  33. for i := 0 to length(st)-1 do Long[i] := ord(st[length(st)-i])-ord('0');
  34. End;{}
  35. {-------------------------------------}
  36. Function getwrite(inp : integer):byte;
  37. Var
  38. st : string;
  39. code : integer;
  40. rc : integer;
  41. Begin
  42. str(inp,st);
  43. val(st[length(st)],rc,code);
  44. GetWrite := rc;
  45. End;{GetWrite}
  46. {----------------------------------------------}
  47. Function GetMemory(inp : integer) : integer;
  48. Var
  49. code : integer;
  50. st : string;
  51. rc : integer;
  52. Begin
  53. if inp >9 then begin
  54. Str(inp,st);
  55. delete(st,length(st),1);
  56. val(st,rc,code);
  57. GetMemory := rc;
  58. end
  59. else GetMemory :=0;
  60. End;{GetMemory}
  61. {----------------------------------------------}
  62. Procedure Mult(F1,F2:PM;var RES:TM);
  63. Begin
  64. modmain:=0;
  65. modcur:=0;
  66. for i := 0 to length3(f2) do
  67. begin
  68. modcur := 0;
  69. for j := 0 to length3(f1) do
  70. begin
  71. tmp1 := f2^[i]*f1^[j]+modcur;
  72. modcur := getmemory(tmp1);
  73. tmp2 := modmain+res[i+j]+getwrite(tmp1);
  74. res[i+j] := getwrite(tmp2);
  75. modmain := getmemory(tmp2)
  76. end;
  77. a := i+j+1;
  78. b := modcur;
  79. repeat
  80. tmp1 := getwrite(b)+modmain;
  81. res[a] := getwrite(tmp1);
  82. modmain := getmemory(tmp1);
  83. inc(a);
  84. b := getmemory(b)
  85. until getmemory(b) = 0;
  86. end;
  87. End;{Multiply}
  88. {----------------------------------------}
  89. Procedure WriteRes(Re:PM);
  90. Var
  91. i : word;
  92. f : text;
  93. Begin
  94. if ParamCount = 3 then Assign(f,ParamStr(3))
  95. else Assign(f,result);
  96. Rewrite(f);
  97. for i := length3(re) downto 0 do
  98. Write(f,re^[i]);
  99. Close(f);
  100. End;{WriteRes}
  101. {-----------------------------------------}
  102. Procedure _2VN(var FI:TM;st:word);
  103. var i:word;
  104. ret,ret2,ret3:TM;
  105. Begin
  106. fillchar(ret,MAX,0);
  107. fillchar(ret2,MAX,0);
  108. fillchar(ret3,MAX,0);
  109. MakeLong(ret,n);
  110. MakeLong(ret3,n);
  111. for i := 2 to st do
  112. begin
  113. fillchar(ret2,max,0);
  114. MULT(@ret,@ret3,ret2);
  115. ret:=ret2;
  116. end;
  117. FI := Ret;
  118. End;
  119. {-----------------------------------------}
  120. Var
  121. cur : word;
  122. p,ost : word;
  123. Begin
  124. Write('Введите N <=1000 двойки: ');
  125. Read(n);
  126. New(F1);
  127. New(F2);
  128. New(Res);
  129. fillchar(F1^,MAX,0);
  130. fillchar(F2^,MAX,0);
  131. fillchar(Res^,MAX,0);
  132. fillchar(umn,MAX,1);
  133. cur := 1;
  134. p := 1;
  135. while cur+cur < n do
  136. begin
  137. cur := cur+cur;
  138. umn[p] := -1;
  139. inc(p);
  140. end;
  141. ost := n - cur;
  142. repeat
  143. cur := 1;
  144. while cur+cur <= ost do cur := cur+cur;
  145. ost := ost - cur;
  146. umn[p] := cur;
  147. inc(p);
  148. until ost = 0;
  149. WriteLn('Начинаем работу');
  150. MakeLong(F1^,n);
  151. for cur := 1 to p-1 do
  152. begin
  153. if umn[cur] = -1 then
  154. begin
  155. fillchar(res^,max,0);
  156. MULT(F1,F1,Res^)
  157. end
  158. else
  159. begin
  160. _2VN(F2^,umn[cur]);
  161. fillchar(res^,max,0);
  162. MULT(F1,F2,Res^)
  163. end;
  164. F1^:=RES^;
  165. end;
  166. WriteLn('Работа окончена !!!');
  167. WriteRes(Res);
  168. Dispose(F1);
  169. Dispose(F2);
  170. Dispose(Res);
  171. End.