Advertisement
Guest User

НЕ ПРОХОДИТ ТЕСТ 3 И 27

a guest
Feb 25th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. program n_1;
  2. uses crt;
  3. var a, n, b : array of integer;
  4.  
  5. function DelZero(a: array of integer): array of integer;
  6. var i: integer;
  7. begin
  8. for i:= Length(a)-1 downto 1 do
  9. if a[i] = 0 then SetLength(a, Length(a)-1)
  10. else break;
  11. if Length(a) = 1 then
  12. begin
  13. setLength(a, 2);
  14. a[1] := 0;
  15. end;
  16. result := a;
  17. end;
  18.  
  19. function LongRead(): array of integer;
  20. var a: array of integer;
  21. i, n: integer;
  22. s: string;
  23. label 1;
  24. begin
  25. 1: setlength(a, 0);
  26. readln(s);
  27. n:=length(s)+1;
  28. setlength(a, n);
  29. for i:=1 to Length(s) do
  30. begin
  31. if not integer.TryParse(s[i], a[n-i]) then Goto 1;
  32. a[length(s)-i+1] := strtoint(s[i]);
  33. end;
  34. a := DelZero(a);
  35. result := a;
  36. end;
  37.  
  38. function LongShortMult(LI : array of integer; SI : integer): array of integer;
  39. var LTemp: array of integer;
  40. CarryOver, TempCarryOver: integer;
  41. i :integer;
  42. begin
  43. CarryOver := 0;
  44. SetLength(LTemp, Length(LI));
  45. for i:= 1 to Length(LI)-1 do
  46. begin
  47. LTemp[i]:= (LI[i] * SI + CarryOver) MOD 10;
  48. CarryOver := CarryOver div 10 + (LI[i]*SI) DIV 10;
  49. end;
  50. if CarryOver > 0 then
  51. begin
  52. TempCarryOver := CarryOver;
  53. while TempCarryOver > 0 do
  54. begin
  55. SetLength(LTemp, Length(LTemp)+1);
  56. LTemp[Length(LTemp)-1]:= TempCarryOver mod 10;
  57. TempCarryOver := TempCarryOver div 10;
  58. end;
  59. end;
  60. lI:= lTemp;
  61. result := LTemp;
  62. end;
  63.  
  64. procedure LongWrite(LI: array of integer);
  65. var i: integer;
  66. begin
  67. LI := DelZero(LI);
  68. for i:=length(LI)-1 downto 1 do
  69. write(LI[i]);
  70. if Length(LI) = 1 then write('0');
  71. writeln;
  72. end;
  73.  
  74. function LongDiv2(LI : array of integer): array of integer; // Только для четных
  75. var LTemp: array of integer;
  76. CarryOver, i: integer;
  77. begin
  78. SetLength(LTemp, length(LI));
  79. CarryOver := 0;
  80. for i:=length(LI)-1 downto 1 do
  81. begin
  82. LTemp[i] := (CarryOver * 10 + LI[i]) div 2 ;
  83. CarryOver := LI[i] mod 2;
  84. end;
  85. if LTemp[length(LI)-1] = 0 then
  86. SetLength(LTemp, length(LI)-1);
  87. LTemp := DelZero(LTemp);
  88. Result := LTemp;
  89. end;
  90.  
  91. procedure LongDec(LI: array of integer);
  92. var i, j: integer;
  93. label 1;
  94. begin
  95. for i:=1 to Length(LI)-1 do
  96. if LI[i]>0 then
  97. begin
  98. for j:= 1 to i-1 do LI[j]:=9;
  99. dec(lI[i]);
  100. break;
  101. end;
  102. LI := DelZero(LI);
  103. end;
  104.  
  105. function LongMax(LI1, LI2: array of integer) : array of integer; // проверить
  106. var i: integer;
  107. begin
  108. LI1 := DelZero(LI1);
  109. LI2 := DelZero(LI2);
  110. if Length(LI1) > Length(LI2) then result := LI1
  111. else if Length(LI1) < Length(LI2) then result := LI2
  112. else If Length(LI1) = Length(LI1) then
  113. begin
  114. for i:= Length(LI1)-1 downto 1 do
  115. if LI1[i] > LI2[i] then
  116. begin
  117. result := LI1;
  118. break;
  119. end
  120. else
  121. if LI1[i] < LI2[i] then
  122. begin
  123. result := LI2;
  124. break;
  125. end
  126. else result := LI1;
  127. end;
  128. end;
  129.  
  130. function LongLongPlus(LI1, LI2 : array of integer) : array of integer;// проверить
  131. Var LTemp : array of integer;
  132. CarryOver, i, Len: integer;
  133. begin
  134. Len := Length(LongMax(LI1, LI2))+1;
  135. SetLength(LI1, Len);
  136. SetLength(LI2, Len);
  137. SetLength(LTemp, Len);
  138. for i:= 1 to Length(LTemp)-1 do
  139. begin
  140. LTemp[i] := (LI1[i] + LI2[i]) mod 10 + CarryOver;
  141. CarryOver := (LI1[i] + LI2[i]) div 10;
  142. end;
  143. if CarryOver > 0 then
  144. begin
  145. SetLength(LTemp, Length(LTemp)+1);
  146. LTemp[Length(LTemp)-1] := CarryOver;
  147. end;
  148. LTemp := DelZero(LTemp);
  149. Result := LTemp;
  150.  
  151. end;
  152.  
  153. function LongLongPlusX10(LI, LIx10: array of integer): array of integer; // проверить
  154. var LTempX10, LTemp: array of integer;
  155. i: integer;
  156. begin
  157. SetLength(LTempX10, Length(LIx10)+1);
  158. LTempX10[1] := 0;
  159. For i:= Length(LTempX10)-1 downto 1 do
  160. begin
  161. LTempX10[i] := LIx10[i-1];
  162. end;
  163. LTemp := LongLongPlus(LTempX10, LI);
  164. result := LTemp;
  165. end;
  166.  
  167. function LongLongMult(LI1, LI2: array of integer): array of integer; // учусь умножать ☺
  168. var LTemp: array of integer;
  169. i: integer;
  170. begin
  171. SetLength(LTemp, Length(LI1) + Length(LI2) + 1);
  172. LTemp := LongShortMult(LI1, LI2[Length(LI2)-1]);
  173. for i := Length(LI2) - 2 downto 1 do
  174. begin
  175. LTemp := LongLongPlusX10(LongShortMult(LI1, LI2[i]) ,LTemp);
  176. end;
  177. LTemp := DelZero(LTemp);
  178. result := LTemp;
  179. end;
  180.  
  181. begin
  182.  
  183. a := LongRead; // НЕ ПРОЙДЕН ТЕСТ 3, 27.
  184. n := LongRead;
  185. SetLength(b, 2);
  186. b[1] := 1;
  187. while (n[1] > 0) or (Length(n) > 2) do
  188. begin
  189. writeln('n = ', n,' a = ',a);
  190. if n[1] mod 2 = 0 then
  191. begin
  192. n := LongDiv2(n);
  193. a := LongLongMult(a, a);
  194. end
  195. else
  196. begin
  197. LongDec(n);
  198. b := LongLongMult(b, a);
  199. end;
  200. end;
  201. LongWrite(b);
  202. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement