Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. /*
  7. По заданному натуральному числу А требуется найти наибольшее число В такое, что B2 <= A.
  8. Входные данные
  9. Во входном файле INPUT.TXT записано натуральное число A (A <= 103000).
  10. Выходные данные
  11. В выходной файл OUTPUT.TXT выведите максимальное натуральное число B, квадрат которо-го не превосходит A. Число B следует выводить без лидирующих нулей.
  12. */
  13.  
  14.  
  15.  
  16.  
  17. bool more(int* A, int* B, int &sizeA, int &sizeB)
  18. {
  19. if (sizeA > sizeB)
  20. {
  21. return 1;
  22. }
  23. else
  24. {
  25. if (sizeA < sizeB)
  26. {
  27. return 0;
  28. }
  29. else
  30. {
  31. for (int i = sizeA - 1; i >= 0; i--)
  32. {
  33. if (A[i] > B[i])
  34. {
  35. return 1;
  36. }
  37. if (A[i] < B[i])
  38. {
  39. return 0;
  40. }
  41.  
  42. }
  43. return 0;
  44. }
  45. }
  46. }
  47.  
  48. int* mult(int* A, int* B, int sizeA, int sizeB, int & length)
  49. {
  50. length = sizeA + sizeB;
  51. int* C = new int[length];
  52. int BS = 0, BM = 0;
  53.  
  54. for (int i = 0; i < length; i++)
  55. C[i] = 0;
  56.  
  57. for (int i = 0; i < sizeA; i++)
  58. {
  59. for (int j = 0; j < sizeB; j++)
  60. {
  61. C[i + j] += A[i] * B[j];
  62. }
  63. }
  64.  
  65. for (int i = 0; i < length; i++)
  66. {
  67. C[i + 1] += C[i] / 10;
  68. C[i] = C[i] % 10;
  69. }
  70.  
  71. while (C[length-1] == 0) length--;
  72.  
  73. return C;
  74. }
  75.  
  76. int len(int* A)
  77. {
  78. int l = 0;
  79. while (A[l] != -1) l++;
  80. return l;
  81. }
  82.  
  83. void inc(int* B, int i)
  84. {
  85. if (B[i] == 9) { B[i] = 0; inc(B, i + 1); }
  86. else if (B[i] == -1) B[i] = 1;
  87. else B[i]++;
  88. }
  89.  
  90. void dec(int* B, int i)
  91. {
  92. if (B[i] == 0) { B[i] = 9; dec(B, i + 1); }
  93. else B[i]--;
  94. }
  95.  
  96.  
  97. int main()
  98. {
  99. setlocale(LC_ALL, "RUS");
  100. ifstream fin("input.txt");
  101. ofstream fout("output.txt");
  102.  
  103. int* A;
  104. int* B;
  105. int sizeA = 0;
  106. int sizeB = 1;
  107.  
  108. string str;
  109. fin >> str;
  110. A = new int[str.length()];
  111.  
  112. for (int i = str.length() - 1; i >= 0; i--)
  113. {
  114. A[str.length()-1-i] = (str[i] - '0') - 0;
  115. sizeA++;
  116. }
  117.  
  118. B = new int[str.length()+3];
  119.  
  120. for (int i = 1; i < str.length()+3; i++) B[i] = -1;
  121.  
  122. //ЭТУ ХУЙНЮ НАДО ИЗМЕНИТЬ
  123. for (int i = (str.length() - 1)/3; i >= 0; i--)
  124. {
  125. B[str.length()-i+3] = A[str.length() - 1 - i];
  126.  
  127. }
  128.  
  129.  
  130. int length = 0;
  131. int* C = mult(B, B, sizeB, sizeB, length);
  132. int* CD = C;
  133.  
  134. while (!more(C, A, length, sizeA))
  135. {
  136. inc(B, 0);
  137.  
  138. for (int i = 0; i < length; i++)
  139. cout << C[i];
  140. cout << endl;
  141.  
  142. sizeB = len(B);
  143. CD = C; int lo = length;
  144. C = mult(B, B, sizeB, sizeB, length);
  145. delete[] CD;
  146. }
  147.  
  148. dec(B, 0);
  149.  
  150. for (int i = sizeB-1; i >= 0; i--)
  151. fout << B[i];
  152. cout << endl;
  153.  
  154.  
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement