2VN.PAS 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. Const
  2. file1 = 'Num1.txt';
  3. file2 = 'num2.txt';
  4. result = 'Res.txt';
  5. max = 4000;
  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. Function getwrite(inp : integer):byte;
  30. Var
  31. st : string;
  32. code : integer;
  33. rc : integer;
  34. Begin
  35. str(inp,st);
  36. val(st[length(st)],rc,code);
  37. GetWrite := rc;
  38. End;{GetWrite}
  39. {----------------------------------------------}
  40. Function GetMemory(inp : integer) : integer;
  41. Var
  42. code : integer;
  43. st : string;
  44. rc : integer;
  45. Begin
  46. if inp >9 then begin
  47. Str(inp,st);
  48. delete(st,length(st),1);
  49. val(st,rc,code);
  50. GetMemory := rc;
  51. end
  52. else GetMemory :=0;
  53. End;{GetMemory}
  54. {----------------------------------------------}
  55. Procedure Mult(F1,F2:PM;var RES:TM);
  56. Begin
  57. modmain:=0;
  58. modcur:=0;
  59. for i := 0 to length3(f2) do
  60. begin
  61. modcur := 0;
  62. for j := 0 to length3(f1) do
  63. begin
  64. tmp1 := f2^[i]*f1^[j]+modcur;
  65. modcur := getmemory(tmp1);
  66. tmp2 := modmain+res[i+j]+getwrite(tmp1);
  67. res[i+j] := getwrite(tmp2);
  68. modmain := getmemory(tmp2)
  69. end;
  70. a := i+j+1;
  71. b := modcur;
  72. repeat
  73. tmp1 := getwrite(b)+modmain;
  74. res[a] := getwrite(tmp1);
  75. modmain := getmemory(tmp1);
  76. inc(a);
  77. b := getmemory(b)
  78. until getmemory(b) = 0;
  79. end;
  80. End;{Multiply}
  81. {----------------------------------------}
  82. Procedure WriteRes(Re:PM);
  83. Var
  84. i : word;
  85. f : text;
  86. Begin
  87. if ParamCount = 3 then Assign(f,ParamStr(3))
  88. else Assign(f,result);
  89. Rewrite(f);
  90. for i := length3(re) downto 0 do
  91. Write(f,re^[i]);
  92. Close(f);
  93. End;{WriteRes}
  94. {-----------------------------------------}
  95. Procedure _2VN(var FI:TM;st:word);
  96. var i:word;
  97. ret,ret2,ret3:TM;
  98. Begin
  99. fillchar(ret,MAX,0);
  100. fillchar(ret2,MAX,0);
  101. fillchar(ret3,MAX,0);
  102. ret[0] := 2;
  103. ret3[0] := 2;
  104. for i := 2 to st do
  105. begin
  106. fillchar(ret2,max,0);
  107. MULT(@ret,@ret3,ret2);
  108. ret:=ret2;
  109. end;
  110. FI := Ret;
  111. End;
  112. {-----------------------------------------}
  113. Var
  114. cur : word;
  115. p,ost : word;
  116. Begin
  117. Write('‚¢¥¤¨â¥ á⥯¥­ì ¤¢®©ª¨: ');
  118. Read(n);
  119. New(F1);
  120. New(F2);
  121. New(Res);
  122. fillchar(F1^,MAX,0);
  123. fillchar(F2^,MAX,0);
  124. fillchar(Res^,MAX,0);
  125. fillchar(umn,MAX,1);
  126. cur := 1;
  127. p := 1;
  128. while cur+cur < n do
  129. begin
  130. cur := cur+cur;
  131. umn[p] := -1;
  132. inc(p);
  133. end;
  134. ost := n - cur;
  135. repeat
  136. cur := 1;
  137. while cur+cur <= ost do cur := cur+cur;
  138. ost := ost - cur;
  139. umn[p] := cur;
  140. inc(p);
  141. until ost = 0;
  142. { readfile;}
  143. WriteLn('� ç¨­ ¥¬ à ¡®âã');
  144. F1^[0]:=2;
  145. for cur := 1 to p-1 do
  146. begin
  147. if umn[cur] = -1 then
  148. begin
  149. fillchar(res^,max,0);
  150. MULT(F1,F1,Res^)
  151. end
  152. else
  153. begin
  154. _2VN(F2^,umn[cur]);
  155. fillchar(res^,max,0);
  156. MULT(F1,F2,Res^)
  157. end;
  158. F1^:=RES^;
  159. end;
  160. WriteLn('� ¡®â  ®ª®­ç¥­  !!!');
  161. WriteRes(Res);
  162. Dispose(F1);
  163. Dispose(F2);
  164. Dispose(Res);
  165. End.