Система счисления на с++

Системы счисления
Дано целое неотрицательное число в I-ричной системе счисления. Вывести это число в J-ричной системе счисления. 2≤I, J≤36, для представления цифр 10..35 используются прописные латинские буквы А..Z соответственно, число разрядов входного числа не превышает 1000. Input format
В первой строке находятся числа I и J (в десятичной системе счисления), во второй строке — число для перевода.
Output format
Вывести искомое число. Если число начинается с буквы, перед ней не должно быть нуля.

Input
10 36
29234652

Output
HELLO


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Число хранится как вектор цифр, начиная с младших:

"1234" -> [4, 3, 2, 1]

Над числом определена единственная операция "умножить_и_прибавить" - школьное умножение в столбик. Дополнительный параметр - основание системы счисления.

Преобразование состоит в чтении первого числа от старших цифр к младшим и накоплении во втором числе текущей суммы в новой системе счисления. Аналог схемы Горнера.

#include <iostream>
#include <string>
#include <vector>

// number = factor * number + term
void mul_add(int base, int factor, int term, std::vector<int> &number) {
    int carry = term;
    for (auto &digit : number) {
        const int p = digit * factor + carry;
        digit = p % base;
        carry = p / base;
    }
    while (carry != 0) {
        number.push_back(carry % base);
        carry /= base;
    }
}

int value(char c) {
    return ('0' <= c && c <= '9') ? c - '0' : c - 'A' + 10;
}

char image(int d) {
    return (d <= 9) ? '0' + d : 'A' + (d - 10);
}

int main() {
    int b1;
    int b2;
    std::string n1;
    std::cin >> b1 >> b2 >> n1;

    std::vector<int> n2 = {0};
    for (char c : n1) {
        mul_add(b2, b1, value(c), n2);
    }

    for(auto it = n2.rbegin(); it != n2.rend(); ++it) {
        std::cout << image(*it);
    }
    std::cout << '\n';
}
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror temp.cpp 

$ echo 10 36 29234652 | ./a.out 
HELLO

$ echo 36 10 HELLO | ./a.out 
29234652
→ Ссылка