Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- void IncrementFirstHalf(string& number) {
- for (int i = number.size() / 2 - 1; i >= 0; --i) {
- if (number[i] == '9') {
- number[i] = '0';
- continue;
- }
- number[i] += 1;
- return;
- }
- return;
- }
- void IncreaseBackHalf(string& number, int first_half_sum, int second_half_sum) {
- int digit_idx = 0;
- while (first_half_sum > second_half_sum) {
- int64_t diff = first_half_sum - second_half_sum;
- int possible_improvment_on_this_pos = '9' - number[number.size() - 1 - digit_idx];
- if (diff <= possible_improvment_on_this_pos) {
- number[number.size() - 1 - digit_idx] += diff;
- return;
- }
- first_half_sum -= possible_improvment_on_this_pos;
- number[number.size() - 1 - digit_idx] = '9';
- ++digit_idx;
- }
- return;
- }
- string Solution1(string number) {
- int64_t first_half_sum = 0;
- int64_t second_half_sum = 0;
- for (int i = 0; i < number.size() / 2; ++i) {
- first_half_sum += number[i] - '0';
- second_half_sum += number[number.size() - 1 - i] - '0';
- }
- //number is good
- if (first_half_sum != 0 && first_half_sum == second_half_sum) {
- return number;
- }
- //number == 0
- if (first_half_sum == 0) {
- for (char& digit : number) {
- digit = '0';
- }
- number.back() = '1';
- number[number.size() / 2 - 1] = '1';
- return number;
- }
- //first hafl > second half
- if (first_half_sum > second_half_sum) {
- IncreaseBackHalf(number, first_half_sum, second_half_sum);
- return number;
- }
- //first half < second half
- int diff = second_half_sum - first_half_sum + 1;
- int collected_sum = 0;
- int digit_idx = 0;
- while (diff > collected_sum) {
- collected_sum += number[number.size() - 1 - digit_idx] - '0';
- number[number.size() - 1 - digit_idx] = '0';
- ++digit_idx;
- }
- while (digit_idx < number.size() / 2) {
- if (number[number.size() - 1 - digit_idx] < '9') {
- ++number[number.size() - 1 - digit_idx];
- break;
- }
- number[number.size() - 1 - digit_idx] = '0';
- ++digit_idx;
- }
- if (digit_idx >= number.size() / 2) {
- IncrementFirstHalf(number);
- }
- first_half_sum = 0;
- second_half_sum = 0;
- for (int i = 0; i < number.size() / 2; ++i) {
- first_half_sum += number[i] - '0';
- second_half_sum += number[number.size() - 1 - i] - '0';
- }
- IncreaseBackHalf(number, first_half_sum, second_half_sum);
- return number;
- }
- int GetFirstHalfSum(int number, int size) {
- int o = 1;
- for (int i = 0; i < size; ++i) {
- o *= 10;
- }
- number /= o;
- int sum = 0;
- while (number) {
- sum += number % 10;
- number /= 10;
- }
- return sum;
- }
- int GetSecondHalfSum(int number, int size) {
- int sum = 0;
- for (int i = 0; i < size; ++i) {
- sum += number % 10;
- number /= 10;
- }
- return sum;
- }
- string Solution2(int num, int size) {
- int front_sum = GetFirstHalfSum(num, size / 2);
- int back_sum = GetSecondHalfSum(num, size / 2);
- while (front_sum == 0 || front_sum != back_sum) {
- ++num;
- front_sum = GetFirstHalfSum(num, size / 2);
- back_sum = GetSecondHalfSum(num, size / 2);
- }
- string num_str = to_string(num);
- while (num_str.size() < size) {
- num_str = "0" + num_str;
- }
- return num_str;
- }
- int main() {
- std::ios::sync_with_stdio(false);
- std::cin.tie(nullptr);
- int64_t num = 0;
- while (true) {
- string num_str = to_string(num);
- if (num_str.size() % 2 == 1) {
- num_str = "0" + num_str;
- }
- auto res1 = Solution1(num_str);
- auto res2 = Solution2(num, num_str.size());
- if (res1 != res2) {
- cout << num << ' ' << res1 << ' ' << res2 << '\n';
- }
- ++num;
- }
- return 0;
- }
- /*
- test1
- 1234
- 1304
- test2
- 9998
- 9999
- test3
- 9799
- 9889
- test4
- 00
- 11
- test5
- 123432
- 123501
- */
Advertisement
Add Comment
Please, Sign In to add comment