Advertisement
regergr

Untitled

Jan 12th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.10 KB | None | 0 0
  1. program project1;
  2.  
  3. uses
  4. SysUtils,
  5. Math;
  6.  
  7. type
  8. TLongNumber = array of QWord;
  9.  
  10. function GCD(a, b: QWord): QWord;
  11. begin
  12. while (a > 0) and (b > 0) do
  13. begin
  14. if (a > b) then
  15. a := a mod b
  16. else
  17. b := b mod a;
  18. end;
  19. Result := a + b;
  20. end;
  21.  
  22. //function pow(a, n: QWord): QWord;
  23. //var
  24. // x: QWord;
  25. //begin
  26. // x := 1;
  27. // while (n <> 0) do
  28. // begin
  29. // if (n mod 2 = 1) then
  30. // begin
  31. // x := x * a;
  32. // end;
  33. // a := a * a;
  34. // n := n div 2;
  35. //
  36. // end;
  37. // Result := x;
  38. //end;
  39.  
  40. operator * (a, b: TLongNumber) ans: TLongNumber;
  41. var
  42. i, j: integer;
  43. s, buf: QWord;
  44. begin
  45. s := 0;
  46. begin
  47. SetLength(Result, high(a) + high(b) + 1);
  48. for i := 0 to high(Result) do
  49. begin
  50. Result[i] := 0;
  51. end;
  52. for i := 0 to high(b) do
  53. begin
  54. s := 0;
  55. for j := 0 to high(a) do
  56. begin
  57. buf := b[i] * a[j] + s + Result[i+j];
  58. s := buf div 1000000000;
  59. Result[i+j]:=buf mod 1000000000;
  60. end;
  61. if (s > 0) then
  62. begin
  63. if i = high(b) then
  64. SetLength(Result, Length(Result) + 1);
  65. Result[i + high(a) + 1] := s;
  66. end;
  67. end;
  68. end;
  69.  
  70. end;
  71. function Pow(num: TLongNumber; n: integer): TLongNumber;
  72. var
  73. x: TLongNumber;
  74. begin
  75. SetLength(x, 1);
  76. x[0] := 1;
  77. while (n <> 0) do
  78. begin
  79. if (n mod 2 = 1) then
  80. begin
  81. x := x * num;
  82. end;
  83. num := num * num;
  84. n := n div 2;
  85.  
  86. end;
  87. Result := x;
  88. end;
  89.  
  90.  
  91. function Invers_str(str: ansistring): ansistring;
  92. var
  93. newS: ansistring;
  94. i: integer;
  95. begin
  96. for i := length(str) downto 1 do
  97. begin
  98. newS += str[i];
  99. end;
  100. Result := newS;
  101. end;
  102.  
  103.  
  104. //function Mult(lhs: TLongNumber; b: QWord): TLongNumber;
  105. //var
  106. // c: QWord;
  107. // buf, Q: QWOrd;
  108. // i: integer;
  109. //begin
  110. //
  111. // Q := 1000000000;
  112. // c := 0;
  113. // SetLength(Result, high(lhs) + 1);
  114. // for i := 0 to high(Result) do
  115. // begin
  116. // buf := lhs[i] * b + c;
  117. // c := buf div Q;
  118. // Result[i] := buf mod Q;
  119. // end;
  120. // if (c > 0) then
  121. // begin
  122. // SetLength(Result, high(Result) + 2);
  123. // Result[i + 1] := c;
  124. // end;
  125. //end;
  126.  
  127. function fact(a: QWord; out n2, m5: QWord): boolean;
  128. begin
  129. n2 := 0;
  130. m5 := 0;
  131. while (a mod 2 = 0) do
  132. begin
  133. a := a div 2;
  134. n2 += 1;
  135. end;
  136. while (a mod 5 = 0) do
  137. begin
  138. a := a div 5;
  139. m5 += 1;
  140. end;
  141. if (a = 1) then
  142. exit(True)
  143. else
  144. exit(False);
  145. end;
  146.  
  147. function ToLongNumber(a: QWord): TLongNumber;
  148. var
  149. n, i, len: integer;
  150. buf, str: string;
  151. begin
  152. str := IntToStr(a);
  153. len := (length(str) div 9) + 1;
  154. SetLength(Result, len);
  155. n := 0;
  156. i := 1;
  157. str := invers_str(str);
  158. while i <= length(str) do
  159. begin
  160. buf := copy(str, i, 9);
  161. buf := invers_str(buf);
  162. i += 9;
  163. Result[n] := StrToInt(buf);
  164. n += 1;
  165. end;
  166. end;
  167.  
  168. function ToString(val: TLongNumber): ansistring;
  169. var
  170. i, j, Count: integer;
  171. begin
  172. Result := '';
  173. for i := high(val) downto 0 do
  174. begin
  175. if (length(IntToStr(val[i])) < 9) then
  176. begin
  177. Count := 9 - length(IntToStr(val[i]));
  178. for j := 1 to Count do
  179. Result += '0';
  180. end;
  181. Result += IntToStr(val[i]);
  182. end;
  183. i := 1;
  184. while Result[i] = '0' do
  185. begin
  186. if (Result = '0') then
  187. exit('0');
  188. Delete(Result, i, 1);
  189. end;
  190.  
  191. end;
  192.  
  193. function trim_zero(s: string): string;
  194. begin
  195. while s[length(s)] = '0' do
  196. begin
  197. Delete(s, length(s), 1);
  198. end;
  199. Result := s;
  200. end;
  201.  
  202. function divmod(a, b: QWord; n2, m5: QWord): string;
  203. var
  204. zero, ans: string;
  205. i, c: integer;
  206. begin
  207. zero := '';
  208. if (m5 >= n2) then
  209. begin
  210. ans := toString((ToLongNumber(a) * pow(ToLongNumber(2), m5 - n2)));
  211. c := length(ans) - m5;
  212. if (c > 0) then
  213. begin
  214. Result := copy(ans, 1, c) + '.' + copy(ans, c + 1, m5);
  215. end;
  216. if (c <= 0) then
  217. begin
  218. for i := 1 to m5 - length(ans) do
  219. begin
  220. zero += '0';
  221. end;
  222. Result := '0' + '.' + zero + ans;
  223. end;
  224. end;
  225. if (n2 > m5) then
  226. begin
  227. ans := toString((ToLongNumber(a) * pow(ToLongNumber(5), n2 - m5)));
  228.  
  229. c := length(ans) - n2;
  230. if (c > 0) then
  231. begin
  232. Result := copy(ans, 1, c) + '.' + copy(ans, length(ans) - n2 + 1, n2);
  233. end;
  234. if (c <= 0) then
  235. begin
  236. for i := 1 to n2 - length(ans) do
  237. begin
  238. zero += '0';
  239. end;
  240. Result := '0' + '.' + zero + ans;
  241. end;
  242.  
  243. end;
  244. Result := trim_zero(Result);
  245. end;
  246.  
  247. var
  248. A, B, NOD, rem, intPart, n2, m5: QWord;
  249. Dec: boolean;
  250. begin
  251. Assign(input, 'input.txt');
  252. Assign(output, 'output.txt');
  253. reset(input);
  254. rewrite(output);
  255.  
  256. //while not EOF do
  257. begin
  258. readln(A);
  259. Readln(B);
  260.  
  261. NOD := GCD(A, B);
  262. A := A div NOD;
  263. B := B div NOD;
  264. Dec := fact(B, n2, m5);
  265. if (B = 1) then
  266. writeln(A)
  267. else if (A < B) then
  268. begin
  269. if (Dec) then
  270. begin
  271. writeln(divmod(A, B, n2, m5));
  272. end
  273. else
  274. begin
  275. writeln(A, ' ', '/', ' ', B);
  276. end;
  277. end
  278. else if (B < A) then
  279. begin
  280.  
  281. if (Dec) then
  282. begin
  283. Writeln(divmod(A, B, n2, m5));
  284. end
  285. else
  286. begin
  287. intPart := A div B;
  288. rem := A mod B;
  289. Writeln(intPart, ' ', '(', ' ', rem, ' ', '/', ' ', B, ' ', ')');
  290. end;
  291. end;
  292.  
  293. end;
  294. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement