В системе счисления с основанием больше 10, цифры записываются так: 0, 1, 2, ..., 9, A, B, C, ...
Числа в различных системах счисления будут храниться в строках, при этом при вводе-выводе в элементе с индексом строки будет храниться старший разряд числа, а в последнем элементе — младший разряд. Но при обработке чисел удобней, если в элементе с индексом 0 хранится младший разряд, а в последнем элементе — старший разряд, то есть запись числа нужно развернуть.
Для разворота контейнера (вектора, строки) или её части можно использовать функцию reverse
из файла algorithm
. Она используется так же, как и sort
:
reverse(s.begin(), s.end());
Дана шестнадцатеричная цифра, записанная в переменной типа char
.
Определите её числовое значение.
Решение оформите в виде функции int hex2int(char c)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
hex2int('9') |
9 |
hex2int('F') |
15 |
Решите задачу, обратную предыдущей.
Решение оформите в виде функции char int2hex(int n)
.
Вызов функции | Возвращаемое значение |
---|---|
int2hex(9) |
'9' |
int2hex(15) |
'F' |
Дано число, записанное в двоичной системе счисления. Переведите его в тип int.
Решение оформите в виде функции int bin2int(string s)
.
Сдайте на проверку только тело функции.
Решение должно использовать схему Горнера.
Вызов функции | Возвращаемое значение |
---|---|
bin2int("10110011") |
179 |
Решите предыдущую задачу в случае, когда входное число задано в шестнадцатеричном
виде. Соответствующая функция должна называться int hex2int(string s)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
hex2int("B3") |
179 |
Переведите число из int в двоичную систему числения.
Решение оформите в виде функции string int2bin(int n)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
int2bin(179) |
"10110011" |
Переведите число из десятичной системы в шестнадцатеричную.
Решение оформите в виде функции string int2hex(int n)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
int2hex(179) |
"B3" |
Напишите программу, переводящую запись числа между двумя произвольными системами счисления.
На вход программа получает три величины: n, A, k, где n и k – натуральные числа от 2 до 36: основания системы счисления, A – число, записанное в в системе счисления с основанием n, A<231.
Необходимо вывести значение A в системе счисления с основанием k без лидирующих нулей.
Решение должно содержать две функции перевода — из числа в произвольной системе счисления, записанного в переменной типа string в переменную типа int и обратно. Сдайте на проверку всю программу.
Ввод | Вывод |
---|---|
2 |
2F |
10 |
Z |
Переведите число из шестнадцатеричной системы счисления в двоичную. Исходное число может быть очень большим (до \(2\times10^5\) символов). Необходимо вывести результат без лидирующих нулей.
Решение оформите в виде функции string hex2bin(string s)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
hex2bin("2F") |
"101111" |
Переведите число из двоичной системы счисления в шестнадцатеричную. Исходное число может быть очень большим (до \(1{,}2\times10^6\) символов).
Решение оформите в виде функции string bin2hex(string s)
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
bin2hex("101111") |
"2F" |
В уравновешенной троичной системе счисления используется основание 3 и три цифры: 0, 1 и -1. Цифру -1 будем обозначать знаком $. Достоинство уравновешенной троичной системы счисления: простота хранения отрицательных чисел и удобство нахождения числа, противоположному данному.
Вот как записываются небольшие числа в уравновешенной троичной системе счисления:
Десятичная | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Уравнов. троичная | $00 | $01 | $1$ | $10 | $11 | $$ | $0 | $1 | $ | 0 | 1 | 1$ | 10 | 11 | 1$$ | 1$0 | 1$1 | 10$ | 100 |
Подробней о уравновешенной троичной системе счисления можно прочитать в Википедии (статья Троичная система счисления, там используется термин "троичная симметричная система счисления").
Дана запись числа в уравновешенной троичной системе счисления. Переведите её в значение типа int.
Решение оформите в виде функции int ter2int(string s)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
ter2int("$01") |
-8 |
Рассмотрим последовательность Фибоначчи: \(\varphi_1=1\), \(\varphi_2=2\), \(\varphi_n=\varphi_{n-1}+\varphi_{n-2}\) при \(n\gt 2\). В частности, \(\varphi_3=3\), \(\varphi_4=5\), \(\varphi_5=8\) и т.д.
Любое натуральное число можно представить в виде суммы нескольких членов последовательности Фибоначчи. Такое представление будет неоднозначным, но если наложить дополнительное условие, что в представлении нет двух соседних членов последовательности Фибоначчи, то представление становится единственным.
Будем говорить, что число \(A\) представимо в фибоначчиевой системе счисления в виде \(a_ka_{k-1}...a_1\), где \(a_i\in\{0;1\}\), если \(A=a_k\varphi_k+...+a_1\varphi_1\) и в записи \(a_ka_{k-1}...a_1\) нет двух единиц подряд.
Вот как записываются небольшие числа в фибоначчиевой системе счисления:
Десятичная | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Фибоначчиева | 1 | 10 | 100 | 101 | 1000 | 1001 | 1010 | 10000 | 10001 | 10010 | 10100 | 10101 | 100000 |
Подробней о фибоначчиевой системе счисления можно прочитать в Википедии (статья Фибоначчиева система счисления).
Дана запись числа в фибоначчиевой системе счисления. Переведите его в тип int. Гарантируется, что результат принимает значения от 0 до \(2\times 10^9\).
Решение оформите в виде функции int fib2int(string s)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
fib2int("10101") |
12 |
Дано целое число oт \(-2\times 10^9\) до \(2\times 10^9\). Найдите его представление в уравновешенной троичной системе счисления без лидирующих нулей (за исключением числа 0, запись которого имеет вид 0).
Решение оформите в виде функции string int2ter(int n)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
int2ter(-8) |
"$01" |
Дано целое число oт 1 до \(2\times 10^9\). Выведите его представление в фибоначчиевой системе счисления без лидирующих нулей.
Решение оформите в виде функции string int2fib(int n)
.
Сдайте на проверку только тело функции.
Вызов функции | Возвращаемое значение |
---|---|
int2fib(12) |
"10101" |
Дана запись числа в некоторой системе счисления. Увеличьте число на 1 и верните его представление в этой же системе счисления.
Решение оформите в виде функции void inc(string & n, int base)
.
Сдайте на проверку только тело функции.
Первый параметр — запись числа в некоторой системе счисления, запись содержит символы '0', ..., '9', 'A', ..., 'Z', второй параметр — основание системы счисления, не превосходящее 36. Длина числа не превосходит 100000 символов.
Вызов функции | Вывод |
---|---|
string n = "19A"; |
1A0 |
Решите аналогичную задачу для уменьшения числа на 1.
Решение оформите в виде функции void dec(string & n, int base)
.
Сдайте на проверку только тело функции.
Вызов функции | Вывод |
---|---|
string n = "1A0"; |
19A |
Реализуйте инкремент числа в уравновешенной троичной системе счисления.
Решение оформите в виде функции void inc_ter(string & n)
.
Сдайте на проверку только тело функции.
Входная строка может иметь длину до 100000 символов.
Вызов функции | Вывод |
---|---|
string n = "$01"; |
$1$ |
Реализуйте декремент числа в уравновешенной троичной системе счисления.
Решение оформите в виде функции void dec_ter(string & n)
.
Сдайте на проверку только тело функции.
Входная строка может иметь длину до 100000 символов.
Вызов функции | Вывод |
---|---|
string n = "$1$"; |
$01 |
Реализуйте инкремент числа в фибоначчиевой системе счисления.
Решение оформите в виде функции void inc_fib(string & n)
.
На проверку сдайте только тело функции.
Входная строка может иметь длину до 100000 символов.
Вызов функции | Вывод |
---|---|
string n = "100101"; |
101000 |
Реализуйте декремент числа в фибоначчиевой системе счисления.
Решение оформите в виде функции void dec_fib(string & n)
.
Входная строка может иметь длину до 100000 символов.
Вызов функции | Вывод |
---|---|
string n = "101000"; |
100101 |
Дано два шестнадцатеричных числа, длиной до 100000 символов каждый. Вычислите их сумму.
Решение оформите в виде функции string sum_hex(string n1, string n2)
.
Вызов функции | Возвращаемое значение |
---|---|
sum_hex("F1", "F") |
"100" |
Реализуйте сложение в уравновешенной троичной системе счисления.
Решение оформите в виде функции string sum_ter(string n1, string n2)
.
Вызов функции | Возвращаемое значение |
---|---|
sum_ter("1$$$", "$0$") |
"11" |
Пример соответствует выражению 14+(-10)=4.
Реализуйте сложение в фибоначчиевой системе счисления.
Решение оформите в виде функции string sum_fib(string n1, string n2)
.
Сложность решения: квадрат от длины входных чисел (длина входных чисел до 1000 знаков, ограничение по времени — 1 секунда).
Вызов функции | Возвращаемое значение |
---|---|
sum_fib("10010", "10101") |
"1000001" |
Реализуйте алгоритм вычитания двух чисел, записанных в шестнадцатеричной системе счисления.
Решение оформите в виде функции string dif_hex(string n1, string n2)
.
Сложность решения: линейная от длины входных чисел (длина чисел до 100000 знаков, ограничение по времени — 1 секунда).
Вызов функции | Возвращаемое значение |
---|---|
dif_hex("100", "F") |
"F1" |
Реализуйте вычитание в фибоначчиевой системе счисления.
Решение оформите в виде функции string dif_fib(string n1, string n2)
.
Гарантируется, что первое данное число не меньше второго.
Сложность решения: квадрат от длины входных чисел (длина чисел до 1000 знаков, ограничение по времени — 1 секунда).
Вызов функции | Возвращаемое значение |
---|---|
dif_fib("1000001", "10101") |
"10010" |
Реализуйте алгоритм умножения длинного числа, записанного в шестнадцатеричной системе счисления, на короткое число (из одной шестнадцатеричной цифры).
Решение оформите в виде функции string mul_hex(string n1, string n2)
. Гарантируется,
что второй параметр состоит ровно из одной цифры.
Сложность решения: линейная от длины первого числа (длина числа до 100000 знаков, ограничение по времени — 1 секунда).
Не забудьте, что в ответе может получиться 0, который записывается строкой "0".
Вызов функции | Возвращаемое значение |
---|---|
mul_hex("A38", "D") |
"84D8" |
Реализуйте алгоритм умножения двух чисел, записанных в шестнадцатеричной системе счисления.
Решение оформите в виде функции string mul_hex(string n1, string n2)
.
Сложность решения: квадрат от длины входных чисел (длина чисел до 1000 знаков).
Советы по реализации:
Вызов функции | Возвращаемое значение |
---|---|
mul_hex("A1", "7F") |
"4FDF" |
В развёрнутой фибоначчиевой форме запись числа в фибоначчиевой системе счисления не содержит двух подряд идущих нулей. Для каждого числа существует единственное представление в развёрнутой фибоначчиевой форме.
Дано целое число oт 1 до 2·109. Найдите его представление в развёрнутой фибоначчиевой форме.
Решение оформите в виде функции string int2fib(int n)
Вызов функции | Возвращаемое значение |
---|---|
int2fib(13) |
"10110" |
Реализуйте алгоритм умножения длинных чисел, записанных в шестнадцатеричной системе счисления, при помощи метода Карацубы.
Решение оформите в виде функции string mul_hex(string n1, string n2)
.
Требования к решению: вычисления должны проводиться в 16-ричной системе счисления (нельзя переходить к большему основанию, например, 256 или 65536). Длина входных чисел — до 50000 знаков, ограничение по времени — 1 секунда.
Советы по реализации
Вызов функции | Возвращаемое значение |
---|---|
mul_hex("A1", "7F") |
"4FDF" |