повышенный уровень, время – 3 мин)




Тема: Позиционные системы счисления.

Что проверяется:

Знание позиционных систем счисления.

1.4.1. Позиционные системы счисления.

1.1.3. Умение строить информационные модели объектов, систем и процессов в виде алгоритмов(?).

Что нужно знать:

· принципы кодирования чисел в позиционных системах счисления

· чтобы перевести число, скажем, 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 единиц:

· число 2 N 2 K при 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 нулей:

Пример задания:

Р-25. (демо-2021) Значение арифметического выражения: 497 + 721 – 7 – записали в системе

счисления с основанием 7. Сколько цифр 6 содержится в этой записи?

Решение:

1) приведём все числа к степеням семерки, учитывая, что 49 = 72

714 + 721 – 71

2) расставим степени в порядке убывания:

721 + 714 – 71

3) Очевидно, что «шестёрки» в семеричной записи значения выражения возникнут только за счёт вычисления разности 714 – 71, их количество равно 14-1=13

4) Ответ: 13.

Решение (использование программы):

1) язык Python позволяет работать с большими числами, не задумываясь о том, что для их хранения требуется больше памяти, чем для «обычного» целого числа (когда значение не помещается в 4 байта, интерпретатор автоматически переходит на представление числа в виде массива с «длинной арифметикой»)

2) поэтому может быть написана программа, которая вычисляет нужное значение и методом деления в столбик определяет все цифры его записи в семеричной системе счисления; шестёрки считаем с помощью счётчика count6:

x = 49**7 + 7**21 - 7

count6 = 0

while x:

if x % 7 == 6: count6 += 1

x //= 7

print(count6)

3) Ответ: 13.

Решение (использование программы в среде Pascal ABC.NET, А. Агафонцев):

1) Pascal ABC.NET за счет использования фреймворка.NET позволяет воспользоваться типом System.Numerics.BigInteger (предназначенным для произвольно больших целых со знаком) и связанными с ним функциями.

2) Таким образом, программа получается во многом схожей с программами на Python. Особо отметим, что использование функций возведения в степень не связанных с типом BigInteger для систем с основанием, не являющимся степенью двойки, приводит к неверным результатам из-за использования вещественных чисел. Например, BigInteger(power(9,34)) или BigInteger(9 ** 34) преобразуют вещественное число в целое произвольно большой длины, но еще при операции возведения в степень потеряется часть идеальной, математической мантиссы.

3) В связи с вышесказанным допустимо только использование записей вида BigInteger.Pow(9,34).

4) Полная программа:

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.

5) Ещё одно решение на PascalABC.NET (П.Е. Финкель)

Begin

var k:=0;

var x:=49bi**7+7bi**21-7;

while x>0 do begin

if x mod 7=6 then k+=1;

x:=x div 7;

end;

println(k);

End.

6) здесь «bi» длинным, а ** означает возведение в степень

7) Ответ: 13.

Решение (использование программы на Java, М. Коротков):

1) язык Java позволяет работать с большими числами с помощью типа BigInteger;

2) может быть написана программа, которая вычисляет значение арифметического выражения и методом деления в столбик определяет все цифры его записи в семеричной системе счисления; шестёрки считаем с помощью счётчика amt6:

3) полная программа:

import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
final BigInteger SIX = BigInteger.valueOf(6);
final BigInteger SEVEN = BigInteger.valueOf(7);
final BigInteger NUM1 = BigInteger.valueOf(49).pow(7);
final BigInteger NUM2 = BigInteger.valueOf(7).pow(21);

BigInteger num = NUM1.add(NUM2).subtract(SEVEN);

BigInteger amt6 = BigInteger.ZERO;
while (!num.equals(BigInteger.ZERO)) {
if (num.mod(SEVEN).equals(SIX)) {
amt6 = amt6.add(BigInteger.ONE);
}
num = num.divide(SEVEN);
}
System.out.println(amt6);
}
}

4) Ответ: 13.

Ещё пример задания:

Р-24. (М.В. Кузнецова) Значение арифметического выражения: 6410 + 290 - 16 записали в системе счисления с основанием 8. Сколько цифр «7» содержится в этой записи?

Решение:

1) Приведём все числа к степеням восьмерки, учитывая, что 16 = 64 - 48 =82-6∙81

6410 + 290 - 16 = (82)10 + 23∙30 – (82 – 48) = 820 + 830 – 82 + 6∙81

2) Перепишем выражение, располагая степени восьмёрки в порядке убывания:
820 + 830 – 82 + 6∙81 = 830 + 820 – 82 + 6∙81

3) Очевидно, что «семёрки» в восьмеричной записи значения выражения возникнут только за счёт вычисления разности 820 – 82, их количество равно 20-2=18

4) Ответ: 18.

Решение (использование программы в среде Pascal ABC.NET, А. Агафонцев):

1) В среде 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.

2) Ответ: 18.

3) Ещё одно решение на PascalABC.NET (П.Е. Финкель)

Begin

var k:=0;

var x:=64bi**10+2bi**90-16;

while x>0 do begin

if x mod 8=7 then k+=1;

x:=x div 8;

end;

println(k);

End.

Решение (программа на Python, Б.С. Михлин):

1) если доступна среда программирования на Python, можно написать программу, которая использует встроенную арифметику длинных чисел:

x = 64**10 + 2**90 - 16

print(oct(x).count('7'))

2) ответ: 18.

Ещё пример задания:

Р-23. (М.В. Кузнецова) Значение арифметического выражения: 99 – 39 + 919 – 19 записали в системе счисления с основанием 3. Сколько цифр «2» содержится в этой записи?

Решение:

1) Приведём все числа к степеням тройки, учитывая, что 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

2) Перепишем выражение, располагая степени тройки в порядке убывания:
318 – 39 + 338 – 33 + 2∙31 + 2∙30 = 338 + 318 – 39 – 33 + 2∙31 + 2∙30

3) Сначала рассмотрим часть выражения, в которой имеется два расположенных подряд «минуса»: 318 - 39 ‑ 33:

a. найдём разность двух крайних чисел: 318 – 33, в её троичной записи 18 – 3=15 «двоек» и 3 «нуля»;

b. вычтем из этого числа значение 39: одна из «двоек» (на 10-й справа позиции) уменьшится на 1, остальные цифры не изменятся;

c. итак, троичная запись разности 318 – 39 – 33 содержит 15 – 1=14 «двоек», одну «единицу» и 3 «нуля»

4) Прибавим к полученному значению сумму: 2∙31 + 2∙30 = 223. В троичной записи результата два крайних справа нуля заменяются на «двойки», остаётся один ноль. Общее количество «двоек»: 14+2=16.

5) Прибавление значения 338 не изменит количества «двоек» в троичном числе: слева от имеющихся цифр появятся ещё 38 – 18=20 «нулей» и одна «единица» – на 39-й справа позиции.

6) Итак, результат, записанный в троичной системе, содержит 39 цифр. Его состав: 16 «двоек», 2 «единицы» (их позиции: 39-я и 10-я справа) и 21 «нуль» (39-16-2=21).

7) Ответ: 16.

Ещё пример задания:

Р-22. Значение арифметического выражения: 98 + 35 – 9

записали в системе счисления с основанием 3. Сколько цифр «2» содержится в этой записи?

Решение:

1) приведём все слагаемые к виду 3N и расставим в порядке убывания степеней:

98 + 35 – 9 = 316 + 35 – 32

2) первое слагаемое, 316, даёт в троичной записи одну единицу – она нас не интересует

3) пара 35 – 32 даёт 5 – 2 = 3 двойки

4) Ответ: 3.

Решение (программа, Б.С. Михлин):

1) задача может быть решена с помощью программы на Python, где есть встроенная поддержка длинных чисел:

x = 9**8+3**5-9

x3 = ''

while x:

x3 = str(x%3) + x3

x //= 3

print('Ответ:', x3.count('2'))

2) вариант без использования символьных строк:

x = 9**8+3**5-9

count2 = 0

while x:

if x % 3 == 2:

count2 += 1

x //= 3

print('Ответ:', count2)

3) Ответ: 3.

Решение (электронные таблицы, Б.С. Михлин):

1) эта конкретная задача может быть решена с помощью электронных таблиц

2) Замечание. Электронные таблицы имеют ограничения при работе с длинными целыми числами. Например, Excel при вводе больших чисел заменяет все цифры после 15-го разряда на нули. Это легко проверить, введя в ячейку число с более чем 15-ю разрядами.

Обычно электронные таблицы при этом переходят к экспоненциальному (научному) формату. Если число больше, чем 1015, то оно хранится как вещественное число (неточно). Это ограничивает использование электронных таблиц. В этой задаче заданное число меньше, чем 1015, поэтому использовать электронные таблицы можно.

3) введём заданное число, заданное арифметическим выражением, в ячейку электронной таблицы:

4) выполним алгоритм перевода числа в троичную систему: найдём в B1 остаток от деления числа на 3, а в A2 – частное:

5) скопируем формулы из А2 и В1 вниз до того момента, когда частное станет равно 0 (это означает окончание процесса перевода):

6) подсчитаем в столбце В число остатков, равных 2:

7) Ответ: 3.

8) в OpenOffice Calc нужно использовать такие формулы:

в A2: =QUOTIENT(A1;3)
в B1: =MOD(A1;3)

в B19: =COUNTIF(B1:B18;2)

Ещё пример задания:

Р-21. Сколько значащих нулей в двоичной записи числа
4512 + 8512 – 2128 – 250

Решение (способ Е.А. Смирнова, Нижегородская область):

1) Общая идея: количество значащих нулей равно количеству всех знаков в двоичной записи числа (его длине!) минус количество единиц

2) приведём все числа к степеням двойки, учитывая, что 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

3) старшая степень двойки – 21536, двоичная запись этого числа представляет собой единицу и 1536 нулей, то есть, состоит из 1537 знаков; таким образом, остаётся найти количество единиц

4) вспомним, число 2 N 2 K при K < N записывается как N–K единиц и K нулей:

5) для того чтобы использовать это свойство, нам нужно представить заданное выражение в виде пар вида 2 N 2 K, причём в этой цепочке степени двойки нужно выстроить по убыванию

6) в нашем случае вы выражении

21536 + 21024 – 2128 – 28 + 22 + 21

стоит два знака «минус» подряд, это не позволяет сразу использовать формулу

7) используем теперь равенство , так что – 2128 = – 2129 + 2128; получаем

21536 + 21024 – 2129 + 2128 – 28 + 22 + 21

здесь две пары 2 N 2 K, а остальные слагаемые дают по одной единице

8) общее число единиц равно 1 + (1024 – 129) + (128 – 8) + 1 + 1 = 1018

9) таким образом, количество значащих нулей равно 1537 – 1018 = 519

10) ответ: 519.

Решение (программа на Python, Б.С. Михлин):

3) если доступна среда программирования на Python, можно написать программу, которая использует встроенную арифметику длинных чисел:

x = 4**512 + 8**512 - 2**128 - 250

print(bin(x)[2:].count('0'))

4) ответ: 519.

Ещё пример задания:

Р-20. Сколько единиц в двоичной записи числа
42015 + 8405 – 2150 – 122

Решение (способ Е.А. Смирнова, Нижегородская область):

1) приведём все числа к степеням двойки, учитывая, что 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

2) вспомним, число 2 N 2 K при K < N записывается как N–K единиц и K нулей:

3) для того чтобы использовать это свойство, нам нужно представить заданное выражение в виде пар вида 2 N 2 K, причём в этой цепочке степени двойки нужно выстроить по убыванию

4) в нашем случае вы выражении

24030 + 21215 – 2150 – 27 + 22 + 21

стоит два знака «минус» подряд, это не позволяет сразу использовать формулу

5) используем теперь равенство , так что – 2150 = – 2151 + 2150; получаем

24030 + 21215 – 2151 + 2150 – 27 + 22 + 21

здесь две пары 2 N 2 K, а остальные слагаемые дают по одной единице

6) общее число единиц равно 1 + (1215 – 151) + (150 – 7) + 1 + 1 = 1210

7) ответ: 1210.

Решение (С.О. Куров, Москва):

1) приведём все числа к степеням двойки, учитывая, что 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

2) ищем в разности крайнюю левую степень двойки и крайнюю правую 21215 – 27, при этом 2150 на время «теряем»

3) определяем количество единиц в разности 21215 – 27, получаем 1215 – 7 = 1208 единиц

4) так как «внутри» этой разности есть еще 2150, то просто вычитаем одну единицу: 1208 – 1 = 1207; итого в разности 21215 – 2150 – 27 ровно 1207 единиц

5) осталось прибавить по одной единицы от чисел 24030, 22, 21

6) Ответ: 1210

Решение (программа на Python, Б.С. Михлин):

1) используется встроенная «длинная арифметика» в Python:

x = bin(4**2015 + 8**405 - 2**150 - 122)

print(x.count('1'))

2) ответ: 1210.

Ещё пример задания:

Р-19. Решите уравнение .

Ответ запишите в троичной системе счисления. Основание системы счисления указывать не нужно.

Решение:

1) переведём все числа в десятичную систему счисления:

2) собирая всё в одно уравнение получаем

3) это уравнение имеет два решения, 6 и -8; основание системы счисления – натуральное число, поэтому ответ – 6

4) переводим ответ в троичную систему: 6 = 2∙31 = 203.

5) ответ: 20.

Решение (программа на Python, А.Н. Носкин):

1) можно (но сложнее) решить задачу перебором с помощью программы:

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)

2) ответ: 20.

Решение (программа на Python, Б.С. Михлин):

3) вариант программы:

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)

4) ответ: 20.

Ещё пример задания:

Р-18. Сколько единиц в двоичной записи числа
42014 + 22015 – 8

Решение:

1) приведём все числа к степеням двойки:

42014 + 22015 – 8 = (22)2014 + 22015 – 23 = 24028 + 22015 – 23

2) вспомним, что число 2N-1 в двоичной системе записывается как N единиц: ,
а число 2 N 2 K при K < N записывается как N–K единиц и K нулей:

3) согласно п. 2, число 22015 – 23 запишется как 2012 единиц и 3 нуля

4) прибавление 24028 даст ещё одну единицу, всего получается 2012 + 1 = 2013 единиц

5) ответ: 2013.

Решение (программа на Python, Б.С. Михлин):

5) программа использует встроенную «длинную арифметику» Python:

x = bin(4**2014 + 2**2015 - 8)
print(x.count('1'))

6) ответ: 2013.

Ещё пример задания:

Р-17. Сколько единиц в двоичной записи числа
42016 + 22018 – 8600 + 6

Решение:

1) приведём все числа к степеням двойки, разложив 6 как 22+21

42016 + 22018 – 8600 + 6 = (22)2016 + 22018 - (23)600 + 22 + 21 = 24032 + 22018 – 21800 + 22 + 21

2) вспомним, что число 2N-1 в двоичной системе записывается как N единиц: ,
а число 2 N 2 K при K < N записывается как N–K единиц и K нулей:

3) согласно п. 2, число 22018 – 21800 запишется как 218 единиц и 1800 нулей

4) прибавление 24032 даст ещё одну единицу, а прибавление 22 + 21 – ещё две, всего получается 218 + 3 = 221 единица

5) ответ: 221.

Ещё пример задания:

Р-16. Сколько единиц в двоичной записи числа
42016 – 22018 + 8800 – 80

Решение:

1) приведём все числа к степеням двойки, разложив 80 как 26+24

42016 – 22018 + 8800 – 80 = (22)2016 – 22018 + (23)800 – 22 – 21 = 24032 – 22018 + 22400 – 26 – 24

2) перестроим слагаемые в порядке уменьшения степеней двойки

24032 + 22400 – 22018 – 26 – 24

3) вспомним, что число 2N-1 в двоичной системе записывается как N единиц: ,
а число 2 N 2 K при K < N записывается как N–K единиц и K нулей:

4) согласно п. 2, число 22400 – 22018 запишется как 382 единицы и 2018 нулей

5) добавляем старшее слагаемое 24032, получаем число 24032 + 22400 – 22018, в котором 383 единицы и в конце (после последней единицы) – 2018 нулей:

6) выделим из этого значения последнюю единицу со следующими 2018 нулями как отдельное слагаемое (число 22018):

,

где число K содержит 382 единицы в старших разрядах; таки образом, интересующее нас число равно

7) согласно п. 2, число 22018 – 26 запишется как 2012 единиц и 6 нулей; также выделим последнюю единицу с последующими нулями как отдельное слагаемое:

где число L содержит 2011 единиц

8) теперь остаётся найти, сколько единиц будет в двоичной записи числа 26 – 24, согласно п. 2 находим, что оно содержит 2 единицы

9) таким образом, общее число единиц равно 382 + 2011 + 2 = 2395

10) ответ: 2395.

Решение (способ 2, Е.А. Смирнов, Нижегородская область):

1) приведём все числа к степеням двойки, разложив 80 как 26+24

42016 – 22018 + 8800 – 80 = (22)2016 – 22018 + (23)800 – 22 – 21 = 24032 – 22018 + 22400 – 26 – 24

2) перестроим слагаемые в порядке уменьшения степеней двойки

24032 + 22400 – 22018 – 26 – 24

3) представим – 22018 = – 22019 + 22018 и – 26 = – 27 + 26

24032 + 22400 – 22019 + 22018 – 27 + 26– 24

4) слагаемое 24032 в двоичной записи содержит 1 единицу

5) слагаемое 22400 – 22019 содержит 381 единицу (число 2 N 2 K при K < N в двоичной системе записывается как N–K единиц и K нулей: )

6) слагаемое 22018 – 27 содержит 2011 единиц, слагаемое 26– 24 содержит 2 единицы

7) позиции единиц во всех этих слагаемых не совпадают, поэтому общее количество единиц равно 1 + 381 + 2011 + 2 = 2395

ответ: 2395

Решение (способ 3, А.И. Козлов, г. Северобайкальск):

1) приведём все числа к степеням двойки, разложив 80 как 26+24

42016 – 22018 + 8800 – 80 = (22)2016 – 22018 + (23)800 – 22 – 21 = 24032 – 22018 + 22400 – 26 – 24

2) перестроим слагаемые в порядке уменьшения степеней двойки

24032 + 22400 – 22018 – 26 – 24

3) выражение 22400–24 дает 2396 единиц и 4 нолика в конце, откуда вычеркиваем (заменяем на ноль) единичку, стоящую на седьмом месте справа (26) и, соответственно на 2019 месте справа (22018). Следовательно, остается 2394 единички.

4) С учетом того, что 24032 дает нам одну единицу, в итоге получаем 2395 единиц

5) Ответ: 2395

Ещё пример задания:

Р-15. Решите уравнение .
Ответ запишите в шестеричной системе счисления. Основание системы счисления указывать не нужно.

Решение:

1) удобнее всего перевести все числа в десятичную систему, решить уравнение и результат перевести в шестеричную систему

2) получаем

3) уравнение приобретает вид , откуда получаем

4) переводим 15 в шестеричную систему счисления:

5) ответ: 23.

Решение (программа на Python, А.Н. Носкин):

1) можно (но сложнее) решить задачу с помощью программы:

a = int('60', 8) # перевод "60" в 10-ю систему

b = int('120', 7) # перевод "120" в 10-ю систему

x = b - a # число Х в 10-й системе

x6 = ''

while x > 0:# перевод в 6-ю систему

x6 += str(x%6)

x //= 6

x6 = x6[::-1]# разворот числа

print(x6)

2) ещё один вариант программы (Б.С. Михлин):

x = int('120', 7) - int('60', 8)

print('в 10 c.c:', x)

s = ''

while x:

s = str(x%6) + s

x //= 6

print('Ответ в 6 с.с:', s)

3) ответ: 23.

Ещё пример задания:

Р-14. Запись десятичного числа в системах счисления с основаниями 3 и 5 в обоих случаях имеет последней цифрой 0. Какое минимальное натуральное десятичное число удовлетворяет этому требованию?

Решение:

1) если запись числа в системе счисления с основанием N заканчивается на 0, то это число делится на N нацело

2) поэтому в данной задаче требуется найти наименьшее натуральное число, которое делится одновременно на 3 и на 5, то есть, делится на 15

3) очевидно, что это число 15.

Решение (программа на Python, А.Н. Носкин):

1) можно (но сложнее) решить задачу с помощью программы:

for i in range(1,100):

x = i

x3 = ''

while x > 0:# перевод в 3-ю систему

x3 += str(x%3)

x //= 3

x3 = x3[::-1][-1]# последняя цифра числа

x = i

x5 = ''

while x > 0:

x5 += str(x%5)

x //= 5

x5 = x5[::-1][-1]

if x3 == "0" and x5 == "0":

print(i)

break

2) ответ: 15.

Решение (программа на Python, Б.С. Михлин):

1) Используется тот факт, что последняя цифра в записи числа в системе счисления с основанием N – это остаток от деления этого числа на N:

for x in range(1,101): # ищем решение от 1 до 100

if x%3 == x%5 == 0: # 'and' можно не использовать

print(x)

break

2) ответ: 15.

Ещё пример задания:

Р-13. Запись числа 6710 в системе счисления с основанием N оканчивается на 1 и содержит 4 цифры. Укажите основание этой системы счисления N.

Решение:

1) поскольку запись в системе счисления с основанием N заканчивается на 1, то остаток от деления числа 67 на N равен 1, то есть при некотором целом имеем

2) следовательно, основание N – это делитель числа 66

3) с другой стороны, запись числа содержит 4 цифры, то есть

4) выпишем кубы и четвертые степени первых натуральных чисел, которые являются делителями числа 66:

5) видим, что из этого списка только для числа N = 3 выполняется условие

6) таким образом, верный ответ – 3.

7) можно сделать проверку, переведя число 67 в троичную систему 6710 = 21113

Решение (программа на Python, А.Н. Носкин):

1) можно (но сложнее) решить задачу с помощью программы:

for i in range(2,37):# перебираем возможные основания

x = 67

x_N = ''

while x > 0:# перевод в N-ю систему

x_N += str(x%i)

x //= i

x_N = x_N[::-1]# разворот числа

if x_N[-1]== "1" and len(x_N) == 4:

print(i)

break

2) ответ: 3.

Решение (программа на Python, Б.С. Михлин):

1) Если при переводе из 10-й в N-ю систему счисления очередную полученную цифру дописывать слева к найденным ранее цифрам (т.е. так, как мы и делаем при ручном переводе), то не нужен будет разворот числа.

2) Для i > 10 надо учитывать, что цифра может быть буквой.

3) Верхняя граница основания 99 в цикле for i завышена. Арабских цифр и латинских букв хватит только для оснований до 10+26=36. Далее нет общепринятых правил обозначения цифр (если хотим получать N-ичное представление числа).

for N in range(2, 37): # подбираем основание от 2 до 36

x = 67

s = '' # в s будет представление числа в N-ичной системе

while x:

d = x % N # цифра (digit)

if d < 10:

d = str(d) # цифра от 0 до 9

else:

d = chr(ord('A') + d - 10) # «цифра» от A до Z

s = d + s # цифру d приписываем слева к s

x //= N

if s[-1] == '1' and len(s) == 4:

print(N)

break

4) возможен второй вариант: без представления всего числа в N-й системе счисления; здесь можно брать основание больше 36.

for N in range(2, 101): # подбираем основание от 2 до 100

x = 67

k = 0 # счетчик цифр (разрядов) N-ичного числа

while x:

d = x % N # очередная цифра (digit)

k += 1

if k == 1: d0 = d # d0 - младшая цифра

x //= N

if d0 == 1 and k == 4:

print(N)

break

5) ответ: 3.

Еще пример задания:

Р-12. Запись числа 38110 в системе счисления с основанием N оканчивается на 3 и содержит 3 цифры. Укажите наибольшее возможное основание этой системы счисления N.

Решение:

1) поскольку запись в системе счисления с основанием N заканчивается на 3, то остаток от деления числа 381 на N равен 3, то есть при некотором целом имеем

2) следовательно, основание N – это делитель числа

3) с другой стороны, запись числа содержит 3 цифры, то есть

4) неравенство дает (так как )

5) неравенство дает (так как )

6) таким образом, ; в этом диапазоне делителями числа 378 являются числа

· 9, при получаем запись числа

· 14, при получаем запись числа

· 18, при получаем запись числа

7) наибольшим из приведенных чисел – это 18 (можно было сразу искать подбором наибольший делитель числа 378, начиная с 19 «вниз», на уменьшение)

8) таким образом, верный ответ – 18.

Решение (программа на Python, А.Н. Носкин):

1) можно решить задачу с помощью программы:

for i in range(100,1,-1):# перебираем возможные основания

x = 381

x_N = ''

while x > 0:# перевод в N-ю систему

if x%i>9:break # пропускаем цифры в виде букв

else: x_N += str(x%i)

x //= i

x_N = x_N[::-1]# разворот числа

if x_N == '': pass

elif x_N[-1]== "3" and len(x_N) == 3:

print(i)

break

2) ответ: 18.

Решение (программа на Python, Б.С. Михлин):

1) Если цифры больше девяти не представлять латинскими буквами, то программа даст неверный ответ 27, т.к. 381 в 27-ичной системе не (14)3, а E3 (т.е. двухзначное число)

for N in range(36, 3, -1): # подбираем основание N от 36 до 4

x = 381

s = ''

while x:

d = x % N # цифра (digit)

if d < 10:

d = str(d) # цифра от 0 до 9

else:

d = chr(ord('A') + d - 10) # буквенная цифра от A до Z

s = d + s # цифру d приписываем слева

x //= N

if s[-1] == '3' and len(s) == 3:

print(N)

break

2) ответ: 18.

Еще пример задания:

Р-11. Укажите через запятую в порядке возрастания все десятичные числа, не превосходящие 25, запись которых в системе счисления с основанием четыре оканчивается на 11?

Общий подход:

· вспомним алгоритм перевода числа из десятичной системы в систему с основанием (см. презентацию), из него следует, что младшая цифра результата – это остаток от деления исходного числа на , а две младших цифры – это остаток от деления на и т.д.

· в данном случае , остаток от деления числа на должен быть равен 114 = 5

· потому задача сводится к тому, чтобы определить все числа, которые меньше или равны 25 и дают остаток 5 при делении на 16

Решение (вариант 1, через десятичную систему):

1) общий вид чисел, которые дают остаток 5 при делении на 16:

где – целое неотрицательное число (0, 1, 2, …)

2) среди всех таких чисел нужно выбрать те, что меньше или равны 25 («не превосходят 25»); их всего два: 5 (при ) и 21 (при )

3) таким образом, верный ответ – 5, 21.

Возможные ловушки и проблемы: · выражение «не превосходящие » означает «меньшие или равные », а не строго меньшие · остаток, состоящий из нескольких цифр (здесь – 114), нужно не забыть перевести в десятичную систему · найденные числа нужно записать именно в порядке возрастания, как требуется

Решение (вариант 2, через четверичную систему, предложен О.А. Тузовой):

1) переведем 25 в четверичную систему счисления: 25 = 1214, все интересующие нас числа не больше этого значения

2) из этих чисел выделим только те, которые заканчиваются на 11, таких чисел всего два:
это 114 = 5 и 1114 = 21

3) таким образом, верный ответ – 5, 21.

Возможные ловушки и проблемы: · есть риск случайно «забыть» какое-то число или найти «лишнее» (в данном случае – большее 25) · можно сделать ошибки при переводе чисел из четверичной системы в десятичную или вообще «забыть» перевести

Решение (программа на Python, А.Н. Носкин):

1) можно решить задачу с помощью программы:

for i in range(1,31):# перебираем ответы

x = i

x4 = ''

while x > 0:# перевод в 4-ю систему

x4 += str(x%4)

x //=4

x4 = x4[::-1]# разворот числа

if x4[-2:]== "11":

print(i, end=",")

2) ответ: 5, 21.

Решение (программа на Python, Б.С. Михлин):

1) полная программа:

for d in '0', '1': # d - цифра (digit). При d > 1 - выход за 25

# int - переводит из 4-ой в 10-ую систему

print(int(d+'11', 4), end = ',')

2) Ответ: 5, 21.

Еще пример задания:

Р-10. Укажите через запятую в порядке возрастания все основания систем счисления, в которых запись числа 23 оканчивается на 2.

Общий подход:

· здесь обратная задача – неизвестно основание системы счисления, мы обозначим его через

· поскольку последняя цифра числа – 2, основание должно быть больше 2, то есть

· вспомним алгоритм перевода числа из десятичной системы в систему с основанием (см. презентацию), из него следует, что младшая цифра результата – это остаток от деления исходного числа на

Решение:

1) итак, нужно найти все целые числа , такие что остаток от деления 23 на равен 2, или (что то же самое)

(*)

где – целое неотрицательное число (0, 1, 2, …);

2) сложность в том, что и , и неизвестны, однако здесь нужно «играть» на том, что это натуральные числа

3) из фо



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-11-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: