Тема: Позиционные системы счисления.
Что нужно знать:
-
принципы кодирования чисел в позиционных системах счисления
-
чтобы перевести число, скажем, 12345N, из системы счисления с основанием
в десятичную систему, нужно умножить значение каждой цифры на
в степени, равной ее разряду:
4 3 2 1 0 ← разряды
1 2 3 4 5N = 1·N4 + 2·N3 + 3·N2 + 4·N1 + 5·N0
-
последняя цифра записи числа в системе счисления с основанием
– это остаток от деления этого числа на
-
две последние цифры – это остаток от деления на
, и т.д.
-
число 10N записывается как единица и N нулей:
-
число 10N-1 записывается как N девяток:
-
число 10N-10M = 10M · (10N-M – 1) записывается как N-M девяток, за которыми стоят M нулей:
-
число 2N в двоичной системе записывается как единица и N нулей:
-
число 2N-1 в двоичной системе записывается как N единиц:
-
число 2N–2K при K N в двоичной системе записывается как N–K единиц и K нулей:
-
поскольку
, получаем
, откуда следует, что
-
число 3N записывается в троичной системе как единица и N нулей:
-
число 3N-1 записывается в троичной системе как N двоек:
-
число 3N – 3M = 3M · (3N-M – 1) записывается в троичной системе как N-M двоек, за которыми стоят M нулей:
-
можно сделать аналогичные выводы для любой системы счисления с основанием a:
-
число aN в системе счисления с основанием a записывается как единица и N нулей:
-
число aN-1 в системе счисления с основанием a записывается как N старших цифр этой системы счисления, то есть, цифр (a-1):
-
число aN – aM = aM · (aN-M – 1) записывается в системе счисления с основанием a как N-M старших цифр этой системы счисления, за которыми стоят M нулей:
Пример 1.
Операнды арифметического выражения записаны в системе счисления с основанием 15.
123x515 + 1x23315
В записи чисел переменной x обозначена неизвестная цифра из алфавита 15-ричной системы счисления. Определите наименьшее значение x, при котором значение данного арифметического выражения кратно 14.
Для найденного значения x вычислите частное от деления значения арифметического выражения на 14 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.
Решение:
-
запишем оба слагаемых в развернутой записи в системе счисления с основанием 15:
123x515 + 1x23315 =
(1·154+2·153+3·152+x·15+5) + (1·154+x·153+2·152+3·15+3) =
(2·154+2·153+5·152+ 3·15+8) + (x·153 +x·15)
= (101250 + 6750 + 1125 + 45 + 8) + x · (3375 + 15) = 109178 + 3390·x
-
нам нужно, чтобы выражение Y = 109178 + 3390·x делилось на 14
-
остаток от деления 109178 на 14 равен 6; остаток от деления 3390 на 14 равен 2
-
для того чтобы Y делилось на 14, остаток от деления Y на 14 должен быть равен 0 (14, 28 и т.д.) Попробуем сложить остатки. 6+2*x = 0, даст нам отрицательное значение x, значит нужно взять следующее значение остатка 6+2*x = 14 2*x = 8 x =4.
-
Y = 109178 + 3390·4 = 122738. В качестве ответа нужно поделить Y на 14, получим 8767
-
Ответ 8767.
Решение (программа на Python):
-
полный текст программы:
for x in range (15):
a = 1*15**4 + 2*15**3 + 3*15**2 + x*15 + 5
b = 1*15**4 + x*15**3 + 2*15**2 + 3*15 + 3
if (a+b) %14 == 0:
print( (a+b) // 14 )
break
-
Ответ 8767.
Пример 2.
Значение арифметического выражения: 497 + 721 – 7 – записали в системе
счисления с основанием 7. Сколько цифр 6 содержится в этой записи?
Решение:
-
приведём все числа к степеням семерки, учитывая, что 49 = 72
714 + 721 – 71
-
расставим степени в порядке убывания:
721 + 714 – 71
-
Очевидно, что «шестёрки» в семеричной записи значения выражения возникнут только за счёт вычисления разности 714 – 71, их количество равно 14-1=13
-
Ответ: 13.
Решение (использование программы):
-
язык Python позволяет работать с большими числами, не задумываясь о том, что для их хранения требуется больше памяти, чем для «обычного» целого числа (когда значение не помещается в 4 байта, интерпретатор автоматически переходит на представление числа в виде массива с «длинной арифметикой»)
-
поэтому может быть написана программа, которая вычисляет нужное значение и методом деления в столбик определяет все цифры его записи в семеричной системе счисления; шестёрки считаем с помощью счётчика count6:
x = 49**7 + 7**21 - 7
count6 = 0
while x:
if x % 7 == 6: count6 += 1
x //= 7
print( count6 )
-
Ответ: 13.
Решение (использование программы в среде Pascal ABC.NET):
-
Pascal ABC.NET за счет использования фреймворка .NET позволяет воспользоваться типом System.Numerics.BigInteger (предназначенным для произвольно больших целых со знаком) и связанными с ним функциями.
-
Таким образом, программа получается во многом схожей с программами на Python. Особо отметим, что использование функций возведения в степень не связанных с типом BigInteger для систем с основанием, не являющимся степенью двойки, приводит к неверным результатам из-за использования вещественных чисел. Например, BigInteger(power(9,34)) или BigInteger(9 ** 34) преобразуют вещественное число в целое произвольно большой длины, но еще при операции возведения в степень потеряется часть идеальной, математической мантиссы.
-
В связи с вышесказанным допустимо только использование записей вида BigInteger.Pow(9,34).
-
Полная программа:
var
a: BigInteger;
k: int64;
begin
a := BigInteger.Pow(49, 7) + BigInteger.Pow(7, 21) - 7;
k := 0;
while (a 0) do
begin
if (a mod 7 = 6) then
k := k + 1;
a := a div 7;
end;
writeln(k);
end.
-
Ответ: 13.
Пример 3.
Значение арифметического выражения: 6410 + 290 - 16 записали в системе счисления с основанием 8. Сколько цифр «7» содержится в этой записи?
Решение:
-
Приведём все числа к степеням восьмерки, учитывая, что 16 = 64 - 48 =82-6∙81
6410 + 290 - 16 = (82)10 + 23∙30 – (82 – 48) = 820 + 830 – 82 + 6∙81
-
Перепишем выражение, располагая степени восьмёрки в порядке убывания:
820 + 830 – 82 + 6∙81 = 830 + 820 – 82 + 6∙81
-
Очевидно, что «семёрки» в восьмеричной записи значения выражения возникнут только за счёт вычисления разности 820 – 82, их количество равно 20-2=18
-
Ответ: 18.
Решение (использование программы в среде Pascal ABC.NET):
-
В среде Pascal ABC.NET при использовании типа BigInteger задача может быть решена с помощью программы:
var
a: BigInteger;
k: int64;
begin
a := BigInteger.Pow(64, 10) + BigInteger.Pow(2, 90) - 16;
k := 0;
while (a 0) do
begin
if (a mod 8 = 7) then
k := k + 1;
a := a div 8;
end;
writeln(k);
end.
-
Ответ: 18.
Решение (программа на Python):
-
если доступна среда программирования на Python, можно написать программу, которая использует встроенную арифметику длинных чисел:
x = 64**10 + 2**90 - 16
print( oct(x).count('7') )
-
ответ: 18.
Пример 4.
Значение арифметического выражения: 99 – 39 + 919 – 19 записали в системе счисления с основанием 3. Сколько цифр «2» содержится в этой записи?
Решение:
-
Приведём все числа к степеням тройки, учитывая, что 19=27-8=33-(2∙31+2∙30):
99 – 39 + 919 – 19= (32)9 – 39 + (32)19 – (33 – (2∙31 + 2∙30)) = 318 – 39 + 338 – 33 + 2∙31 + 2∙30
-
Перепишем выражение, располагая степени тройки в порядке убывания:
318 – 39 + 338 – 33 + 2∙31 + 2∙30 = 338 + 318 – 39 – 33 + 2∙31 + 2∙30
-
Сначала рассмотрим часть выражения, в которой имеется два расположенных подряд «минуса»: 318 - 39 ‑ 33:
-
найдём разность двух крайних чисел: 318 – 33, в её троичной записи 18 – 3=15 «двоек» и 3 «нуля»;
-
вычтем из этого числа значение 39: одна из «двоек» (на 10-й справа позиции) уменьшится на 1, остальные цифры не изменятся;
-
итак, троичная запись разности 318 – 39 – 33 содержит 15 – 1=14 «двоек», одну «единицу» и 3 «нуля»
-
Прибавим к полученному значению сумму: 2∙31 + 2∙30 = 223. В троичной записи результата два крайних справа нуля заменяются на «двойки», остаётся один ноль. Общее количество «двоек»: 14+2=16.
-
Прибавление значения 338 не изменит количества «двоек» в троичном числе: слева от имеющихся цифр появятся ещё 38 – 18=20 «нулей» и одна «единица» – на 39-й справа позиции.
-
Итак, результат, записанный в троичной системе, содержит 39 цифр. Его состав: 16 «двоек», 2 «единицы» (их позиции: 39-я и 10-я справа) и 21 «нуль» (39-16-2=21).
-
Ответ: 16.
Пример 5.
Значение арифметического выражения: 98 + 35 – 9
записали в системе счисления с основанием 3. Сколько цифр «2» содержится в этой записи?
Решение:
-
приведём все слагаемые к виду 3N и расставим в порядке убывания степеней:
98 + 35 – 9 = 316 + 35 – 32
-
первое слагаемое, 316, даёт в троичной записи одну единицу – она нас не интересует
-
пара 35 – 32 даёт 5 – 2 = 3 двойки
-
Ответ: 3.
Решение (программа):
-
задача может быть решена с помощью программы на Python, где есть встроенная поддержка длинных чисел:
x = 9**8+3**5-9
x3 = ''
while x:
x3 = str(x%3) + x3
x //= 3
print( 'Ответ:', x3.count('2') )
-
вариант без использования символьных строк:
x = 9**8+3**5-9
count2 = 0
while x:
if x % 3 == 2:
count2 += 1
x //= 3
print( 'Ответ:', count2 )
-
Ответ: 3.
Пример 6.
Сколько значащих нулей в двоичной записи числа
4512 + 8512 – 2128 – 250
Решение:
-
Общая идея: количество значащих нулей равно количеству всех знаков в двоичной записи числа (его длине!) минус количество единиц
-
приведём все числа к степеням двойки, учитывая, что 250 = 256 – 4 – 2 = 28 – 22 – 21:
4512 + 8512 – 2128 – 250 = (22)512 + (23)512 – 2128 – 28 + 22 + 21 =
= 21536 + 21024 – 2128 – 28 + 22 + 21
-
старшая степень двойки – 21536, двоичная запись этого числа представляет собой единицу и 1536 нулей, то есть, состоит из 1537 знаков; таким образом, остаётся найти количество единиц
-
вспомним, число 2N–2K при K N записывается как N–K единиц и K нулей:
-
для того чтобы использовать это свойство, нам нужно представить заданное выражение в виде пар вида 2N–2K, причём в этой цепочке степени двойки нужно выстроить по убыванию
-
в нашем случае вы выражении
21536 + 21024 – 2128 – 28 + 22 + 21
стоит два знака «минус» подряд, это не позволяет сразу использовать формулу
-
используем теперь равенство
, так что – 2128 = – 2129 + 2128; получаем
21536 + 21024 – 2129 + 2128 – 28 + 22 + 21
здесь две пары 2N–2K , а остальные слагаемые дают по одной единице
-
общее число единиц равно 1 + (1024 – 129) + (128 – 8) + 1 + 1 = 1018
-
таким образом, количество значащих нулей равно 1537 – 1018 = 519
-
ответ: 519.
Решение (программа на Python):
-
если доступна среда программирования на Python, можно написать программу, которая использует встроенную арифметику длинных чисел:
x = 4**512 + 8**512 - 2**128 - 250
print( bin(x)[2:].count('0') )
-
ответ: 519.
Пример 7.
Сколько единиц в двоичной записи числа
42015 + 8405 – 2150 – 122
Решение:
-
приведём все числа к степеням двойки, учитывая, что 122 = 128 – 4 – 2 = 27 – 22 – 21:
42015 + 8405 – 2150 – 122 = (22)2015 + (23)405 – 2150 – 27 + 22 + 21 =
= 24030 + 21215 – 2150 – 27 + 22 + 21
-
вспомним, число 2N–2K при K N записывается как N–K единиц и K нулей:
-
для того чтобы использовать это свойство, нам нужно представить заданное выражение в виде пар вида 2N–2K, причём в этой цепочке степени двойки нужно выстроить по убыванию
-
в нашем случае вы выражении
24030 + 21215 – 2150 – 27 + 22 + 21
стоит два знака «минус» подряд, это не позволяет сразу использовать формулу
-
используем теперь равенство
, так что – 2150 = – 2151 + 2150; получаем
24030 + 21215 – 2151 + 2150 – 27 + 22 + 21
здесь две пары 2N–2K , а остальные слагаемые дают по одной единице
-
общее число единиц равно 1 + (1215 – 151) + (150 – 7) + 1 + 1 = 1210
-
ответ: 1210.
Решение (программа на Python):
-
используется встроенная «длинная арифметика» в Python:
x = bin( 4**2015 + 8**405 - 2**150 - 122 )
print( x.count( '1' ) )
-
ответ: 1210.
Пример 8.
Решите уравнение
.
Ответ запишите в троичной системе счисления. Основание системы счисления указывать не нужно.
Решение:
-
переведём все числа в десятичную систему счисления:
-
собирая всё в одно уравнение получаем
-
это уравнение имеет два решения, 6 и -8; основание системы счисления – натуральное число, поэтому ответ – 6
-
переводим ответ в троичную систему: 6 = 2∙31 = 203.
-
ответ: 20.
Решение (программа на Python):
-
можно (но сложнее) решить задачу перебором с помощью программы:
a = 1*7**2 + 0 + 1 # перевод "101" в 10-ю систему
c = a - 1 # число "121" в 10-й системе
for i in range(3,100):# перебираем возможные основания
b = 1*i**2 + 2*i + 1 # перевод в 10-ю систему числа "121"
if b == c:
x = i # основание системы счисления (в 10й системе)
break
x3 = ''
while x 0:# перевод основания в 3-ю систему
x3 += str(x%3)
x //= 3
x3 = x3[::-1]# разворот числа
print(x3)
-
ответ: 20.
Решение (программа на Python):
-
вариант программы:
for x in range( 3, 37): # среди оснований от 3 до 36
if int( '121', x ) + 1 == int( '101', 7 ):
break
print('в 10 c.c:', x)
s = ''
while x:
s = str( x%3 ) + s
x //= 3
print( 'Ответ в 3 с.с:', s )
-
ответ: 20.
Пример 9.
Сколько единиц в двоичной записи числа
42014 + 22015 – 8
Решение:
-
приведём все числа к степеням двойки:
42014 + 22015 – 8 = (22)2014 + 22015 – 23 = 24028 + 22015 – 23
-
вспомним, что число 2N-1 в двоичной системе записывается как N единиц:
,
а число 2N–2K при K N записывается как N–K единиц и K нулей:
-
согласно п. 2, число 22015 – 23 запишется как 2012 единиц и 3 нуля
-
прибавление 24028 даст ещё одну единицу, всего получается 2012 + 1 = 2013 единиц
-
ответ: 2013.
Решение (программа на Python):
-
программа использует встроенную «длинную арифметику» Python:
x = bin( 4**2014 + 2**2015 - 8 )
print( x.count( '1' ) )
-
ответ: 2013.
Пример 10.
Сколько единиц в двоичной записи числа
42016 + 22018 – 8600 + 6
Решение:
-
приведём все числа к степеням двойки, разложив 6 как 22+21
42016 + 22018 – 8600 + 6 = (22)2016 + 22018 - (23)600 + 22 + 21 = 24032 + 22018 – 21800 + 22 + 21
-
вспомним, что число 2N-1 в двоичной системе записывается как N единиц:
,
а число 2N–2K при K N записывается как N–K единиц и K нулей:
-
согласно п. 2, число 22018 – 21800 запишется как 218 единиц и 1800 нулей
-
прибавление 24032 даст ещё одну единицу, а прибавление 22 + 21 – ещё две, всего получается 218 + 3 = 221 единица
-
ответ: 221.
Пример 11.
Сколько единиц в двоичной записи числа
42016 – 22018 + 8800 – 80
Решение:
-
приведём все числа к степеням двойки, разложив 80 как 26+24
42016 – 22018 + 8800 – 80 = (22)2016 – 22018 + (23)800 – 22 – 21 = 24032 – 22018 + 22400 – 26 – 24
-
перестроим слагаемые в порядке уменьшения степеней двойки
24032 + 22400 – 22018 – 26 – 24
-
вспомним, что число 2N-1 в двоичной системе записывается как N единиц:
,
а число 2N–2K при K N записывается как N–K единиц и K нулей:
-
согласно п. 2, число 22400 – 22018 запишется как 382 единицы и 2018 нулей
-
добавляем старшее слагаемое 24032, получаем число 24032 + 22400 – 22018, в котором 383 единицы и в конце (после последней единицы) – 2018 нулей:
-
выделим из этого значения последнюю единицу со следующими 2018 нулями как отдельное слагаемое (число 22018):
,
где число K содержит 382 единицы в старших разрядах; таки образом, интересующее нас число равно
-
согласно п. 2, число 22018 – 26 запишется как 2012 единиц и 6 нулей; также выделим последнюю единицу с последующими нулями как отдельное слагаемое:
где число L содержит 2011 единиц
-
теперь остаётся найти, сколько единиц будет в двоичной записи числа 26 – 24, согласно п. 2 находим, что оно содержит 2 единицы
-
таким образом, общее число единиц равно 382 + 2011 + 2 = 2395
-
ответ: 2395.