CCCPaste

Untitled

#include 
#include 
#include 

using namespace std;
string add_big_integer(string A, string B) { // funkcija koja ke ni sobere A + B
    if(A.size() < B.size()) {
        swap(A, B);
    }
    int a_i = (int) A.size() - 1;
    int b_i = (int) B.size() - 1;
    int carry = 0;
    string sum = "";
    while(a_i >= 0 and b_i >= 0) {
        int digit_a = (A[a_i] - '0');
        int digit_b = (B[b_i] - '0');
        int zbir = digit_a + digit_b + carry;
        
        if(zbir <= 9) {
            sum += (zbir + '0');
            carry = 0;
        }
        else {
            carry = 1;
            zbir -= 10;
            sum += (zbir + '0');
        }
        a_i--;
        b_i--;
    }
    while(a_i >= 0) {
        int digit_a = (A[a_i] - '0');
        int zbir = digit_a + carry;
        if(zbir <= 9) {
            sum += (zbir + '0');
            carry = 0;
        }
        else {
            carry = 1;
            zbir -= 10;
            sum += (zbir + '0');
        }
        a_i--;
    }
    if(carry == 1) {
        sum += "1";
    }
    reverse(sum.begin(), sum.end());
    return sum;
}
string multiply_big_integer(string A, string B) {
    int sz_a = (int) A.size();
    int sz_b = (int) B.size();
    vector v(sz_a + sz_b, 0);
    for(int i = sz_a - 1; i >= 0; i--) {
        for(int j = sz_b - 1; j >= 0; j--) {
            v[i + j + 1] += (A[i] - '0') * (B[j] - '0');
        }
    }
    for(int i = sz_a + sz_b - 1; i >= 0; i--) {
        if(v[i] > 9) {
            v[i - 1] += (v[i] / 10);
            v[i] %= 10;
        }
    }
    int i = 0;
    while(v[i] == 0) {
        i++;
    }
    string product = "";
    for(int j = i; j < sz_a + sz_b; j++) {
        product += (v[j] + '0');
    }
    return product;
}
string divide_by_2(string s, int &rem) {
    string result = "";
    int tmp = (s[0] - '0');
    int i =0;
    while(tmp < 2) {
        tmp = (tmp * 10) + (s[++i] - '0');
    }
    while(s.size() > i) {
        result += (tmp / 2) + '0';
        tmp = (tmp % 2) * 10 + s[++i] - '0';
    }
    if(add_big_integer(result, result) != s) {
        rem = 1;
    }
    if(result.size() == 0) {
        return "0";
    }
    return result;
}
int main() {

    string s;
    cin >> s;
    
    string decimal_number = "";
    string power_of_8 = "1";
    for(int i = (int) s.size() - 1; i >= 0; i--) {
        string a = "";
        a += s[i];
        decimal_number = add_big_integer(decimal_number, multiply_big_integer(a, power_of_8));
        power_of_8 = multiply_big_integer(power_of_8, "8");
    }
    cout << decimal_number << endl;
    string binary_number = "0";
    string power_of_10 = "1";
    while(decimal_number != "0") {
        int rem = 0;
     string divided = divide_by_2(decimal_number, rem);
        string remainder = "0";
        if(rem == 1) {
            remainder = "1";
        }
        binary_number = add_big_integer(binary_number, multiply_big_integer(remainder, power_of_10));
        power_of_10 = multiply_big_integer(power_of_10, "10");
        cout << divided << endl;
        decimal_number = divided;
    }
        cout << binary_number << endl;
    return 0;
}
// 101101101101101101101101101
// 101101101101101101101101101