Derga

Untitled

Jul 7th, 2024
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. void IncrementFirstHalf(string& number) {
  8. for (int i = number.size() / 2 - 1; i >= 0; --i) {
  9. if (number[i] == '9') {
  10. number[i] = '0';
  11. continue;
  12. }
  13. number[i] += 1;
  14. return;
  15. }
  16. return;
  17. }
  18.  
  19. void IncreaseBackHalf(string& number, int first_half_sum, int second_half_sum) {
  20. int digit_idx = 0;
  21. while (first_half_sum > second_half_sum) {
  22. int64_t diff = first_half_sum - second_half_sum;
  23. int possible_improvment_on_this_pos = '9' - number[number.size() - 1 - digit_idx];
  24. if (diff <= possible_improvment_on_this_pos) {
  25. number[number.size() - 1 - digit_idx] += diff;
  26. return;
  27. }
  28. first_half_sum -= possible_improvment_on_this_pos;
  29. number[number.size() - 1 - digit_idx] = '9';
  30. ++digit_idx;
  31. }
  32. return;
  33. }
  34.  
  35. string Solution1(string number) {
  36. int64_t first_half_sum = 0;
  37. int64_t second_half_sum = 0;
  38. for (int i = 0; i < number.size() / 2; ++i) {
  39. first_half_sum += number[i] - '0';
  40. second_half_sum += number[number.size() - 1 - i] - '0';
  41. }
  42.  
  43. //number is good
  44. if (first_half_sum != 0 && first_half_sum == second_half_sum) {
  45. return number;
  46. }
  47.  
  48. //number == 0
  49. if (first_half_sum == 0) {
  50. for (char& digit : number) {
  51. digit = '0';
  52. }
  53. number.back() = '1';
  54. number[number.size() / 2 - 1] = '1';
  55. return number;
  56. }
  57.  
  58. //first hafl > second half
  59. if (first_half_sum > second_half_sum) {
  60. IncreaseBackHalf(number, first_half_sum, second_half_sum);
  61. return number;
  62. }
  63.  
  64. //first half < second half
  65. int diff = second_half_sum - first_half_sum + 1;
  66. int collected_sum = 0;
  67. int digit_idx = 0;
  68. while (diff > collected_sum) {
  69. collected_sum += number[number.size() - 1 - digit_idx] - '0';
  70. number[number.size() - 1 - digit_idx] = '0';
  71. ++digit_idx;
  72. }
  73.  
  74. while (digit_idx < number.size() / 2) {
  75. if (number[number.size() - 1 - digit_idx] < '9') {
  76. ++number[number.size() - 1 - digit_idx];
  77. break;
  78. }
  79. number[number.size() - 1 - digit_idx] = '0';
  80. ++digit_idx;
  81. }
  82.  
  83. if (digit_idx >= number.size() / 2) {
  84. IncrementFirstHalf(number);
  85. }
  86. first_half_sum = 0;
  87. second_half_sum = 0;
  88. for (int i = 0; i < number.size() / 2; ++i) {
  89. first_half_sum += number[i] - '0';
  90. second_half_sum += number[number.size() - 1 - i] - '0';
  91. }
  92.  
  93. IncreaseBackHalf(number, first_half_sum, second_half_sum);
  94. return number;
  95. }
  96.  
  97. int GetFirstHalfSum(int number, int size) {
  98. int o = 1;
  99. for (int i = 0; i < size; ++i) {
  100. o *= 10;
  101. }
  102. number /= o;
  103. int sum = 0;
  104. while (number) {
  105. sum += number % 10;
  106. number /= 10;
  107. }
  108. return sum;
  109. }
  110.  
  111. int GetSecondHalfSum(int number, int size) {
  112. int sum = 0;
  113. for (int i = 0; i < size; ++i) {
  114. sum += number % 10;
  115. number /= 10;
  116. }
  117. return sum;
  118. }
  119.  
  120. string Solution2(int num, int size) {
  121. int front_sum = GetFirstHalfSum(num, size / 2);
  122. int back_sum = GetSecondHalfSum(num, size / 2);
  123. while (front_sum == 0 || front_sum != back_sum) {
  124. ++num;
  125. front_sum = GetFirstHalfSum(num, size / 2);
  126. back_sum = GetSecondHalfSum(num, size / 2);
  127. }
  128.  
  129. string num_str = to_string(num);
  130. while (num_str.size() < size) {
  131. num_str = "0" + num_str;
  132. }
  133. return num_str;
  134. }
  135.  
  136. int main() {
  137. std::ios::sync_with_stdio(false);
  138. std::cin.tie(nullptr);
  139.  
  140. int64_t num = 0;
  141. while (true) {
  142. string num_str = to_string(num);
  143. if (num_str.size() % 2 == 1) {
  144. num_str = "0" + num_str;
  145. }
  146. auto res1 = Solution1(num_str);
  147. auto res2 = Solution2(num, num_str.size());
  148. if (res1 != res2) {
  149. cout << num << ' ' << res1 << ' ' << res2 << '\n';
  150. }
  151. ++num;
  152. }
  153.  
  154. return 0;
  155. }
  156.  
  157. /*
  158. test1
  159. 1234
  160. 1304
  161.  
  162. test2
  163. 9998
  164. 9999
  165.  
  166. test3
  167. 9799
  168. 9889
  169.  
  170. test4
  171. 00
  172. 11
  173.  
  174. test5
  175. 123432
  176. 123501
  177. */
Advertisement
Add Comment
Please, Sign In to add comment