Система счисления на с++
Системы счисления
Дано целое неотрицательное число в I-ричной системе счисления. Вывести это число в J-ричной системе счисления. 2≤I, J≤36, для представления цифр 10..35 используются прописные латинские буквы А..Z соответственно, число разрядов входного числа не превышает 1000. Input format
В первой строке находятся числа I и J (в десятичной системе счисления), во второй строке — число для перевода.
Output format
Вывести искомое число. Если число начинается с буквы, перед ней не должно быть нуля.Input
10 36
29234652Output
HELLO
Ответы (1 шт):
Число хранится как вектор цифр, начиная с младших:
"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