ЦУЙУ. Позиционные системы счисления
![]()
|
Еще пример задания:Р-9. Укажите через запятую в порядке возрастания все основания систем счисления, в которых запись числа 31 оканчивается на 11. Общий подход: неизвестно основание системы счисления, мы обозначим его через ![]() пока будем считать, что запись числа 31 в системе с основанием ![]() ![]() 2 1 0 ← разряды 31 = k 1 1N = k·N2 + N1 + N0 = k·N2 + N + 1 можно показать, что при большем количестве разрядов эта формула также верна, то есть, число 31 можно представить как ![]() ![]() 4 3 2 1 0 ← разряды 31 = k4 k3 k2 1 1N = k4·N4 + k3·N3 + k2·N2 + N1 + N0 = k·N2 + N + 1 для ![]() ![]() Решение: итак, нужно найти все целые числа ![]() ![]() где ![]() сложность в том, что и ![]() ![]() из формулы (**) получаем ![]() ![]() ![]() ![]() выпишем все делители числа 30, большие или равные 2: 2, 3, 5, 6, 10, 15, 30 из всех этих делителей только для 2, 3, 5 и 30 значение ![]() таким образом, верный ответ – 2, 3, 5, 30. Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: for i in range(3,50):# перебираем возможные основания x = 23 # число по условию 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]== "2": print(i, end=",") ответ: 2, 3, 5, 30. Решение (программа на Python, Б.С. Михлин): полная программа: for x in range(2, 101): # x - основание # справа число 11 переведено в 10-ую систему if 31 % (x*x) == x + 1: print( x, end = ',' ) Ответ: 2, 3, 5, 30. Еще пример задания:Р-8. Укажите, сколько всего раз встречается цифра 2 в записи чисел 10, 11, 12, …, 17 в системе счисления с основанием 5. Решение (вариант 1): запишем первое и последнее число в заданном диапазоне в системе счисления с основанием 5: 10 = 205, 17 = 325 . заметим, что оба они содержат цифру 2, так что, 2 цифры мы уже нашли между 205 и 325 есть еще числа 215, 225, 235, 245, 305, 315. в них 5 цифр 2 (в числе 225 – сразу две двойки), поэтому всего цифра 2 встречается 7 раз таким образом, верный ответ – 7.
Решение (вариант 2): переведем все указанные числа в систему счисления с основанием 5: 10 = 205, 11 = 215, 12 = 225, 13 = 235, 14 = 245, 15 = 305, 16 = 315, 17 = 325 . считаем цифры 2 – получается 7 штук таким образом, верный ответ – 7 . Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: k = 0 for i in range(10,17+1): x = i x5 = '' while x > 0:# перевод в 5-ю систему x5 += str(x%5) x //= 5 x5 = x5[::-1]# разворот числа k += x5.count("2") print(k) ответ: 7. Решение (программа на Python, Б.С. Михлин): ещё одна программа: k = 0 # счетчик цифр 2 for x in range(10,17+1): xw = x # xw - рабочая (work) копия x while xw: if xw % 5 == 2: # считаем цифры 2 в 5-ой системе k += 1 xw //= 5 print( k ) ответ: 7. Еще пример задания:Р-7. Укажите наименьшее основание системы счисления, в которой запись числа 30 трехзначна. Решение: обозначим через ![]() ![]() вспомним алгоритм перевода числа из системы счисления с основанием ![]() ![]() поскольку запись трехзначная, ![]() ![]() с другой стороны, четвертой цифры нет, то есть, в третьем разряде – ноль, поэтому ![]() объединяя последние два условия, получаем, что искомое основание ![]() ![]() учитывая, что ![]() ![]() ![]() минимальное из этих значений – 4 таким образом, верный ответ – 4 . Решение (без подбора): выполним п.1-4 так же, как и в предыдущем варианте решения найдем первое целое число, куб которого больше 30; это 4, так как ![]() проверяем второе неравенство: ![]() таким образом, верный ответ – 4 . Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: for i in range(2,100):# перебираем возможные основания x = 30 # число по условию x_N = '' while x > 0:# перевод в N-ю систему x_N += str(x%i) x //= i x_N = x_N[::-1]# разворот числа if len(x_N)== 3: print(i) break ответ: 4. Решение (программа на Python, Б.С. Михлин): полная программа: for N in range(2, 10): # проверять основание N >=10 нет смысла # (будет два или один разряд) if N ** 2 <= 30 < N ** 3: # проверка на трёхзначность print(N) break Ответ: 4. Еще пример задания:Р-6. Укажите через запятую в порядке возрастания все десятичные числа, не превосходящие 30, запись которых в системе счисления с основанием 5 начинается на 3? Решение (вариант 1): нас интересуют числа от 1 до 30 сначала определим, сколько цифр может быть в этих числах, записанных в системе счисления с основанием 5 поскольку ![]() рассмотрим трехзначные числа, начинающиеся на 3 в системе с основанием 5: ![]() все они заведомо не меньше ![]() таким образом, остается рассмотреть только однозначные и двухзначные числа есть всего одно однозначное число, начинающееся на 3, это 3 общий вид всех двузначных чисел, начинающихся на 3 в системе с основанием 5: ![]() где ![]() используя эту формулу, находим интересующие нас двузначные числа – 15, 16, 17, 18 и 19 таким образом, верный ответ – 3, 15, 16, 17, 18, 19 . Решение (вариант 2, предложен Сенькиной Т.С., г. Комсомольск-на-Амуре ): нас интересуют числа от 1 до 30; сначала определим, сколько цифр может быть в пятеричной записи эти чисел поскольку ![]() есть всего одно однозначное число, начинающееся на 3, это 3 выпишем все пятеричные двузначные числа, которые начинаются с 3, и переведем их в десятичную систему: 305 = 15, 315 = 16, 325 = 17, 335 = 18 и 345 = 19 таким образом, верный ответ – 3, 15, 16, 17, 18, 19 . Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: for i in range(1,31):# перебираем ответы x = i x5 = '' while x > 0:# перевод в 5-ю систему x5 += str(x%5) x //= 5 x5 = x5[::-1]# разворот числа if x5[0]== "3": print(i, end=",") ответ: 3, 15, 16, 17, 18, 19. Еще пример задания:Р-05. Укажите через запятую в порядке возрастания все основания систем счисления, в которых запись числа 71 оканчивается на 13. Решение (1 способ): Если число в системе с основанием ![]() ![]() это число можно представить в виде ![]() ![]() определим наибольшее возможное ![]() ![]() ![]() ![]() очевидно, что чем меньше ![]() ![]() ![]() ![]() здесь мы подставили ![]() ![]() остается перебрать все допустимые значения ![]() ![]() ![]() ![]() относительно ![]() ![]() получаем при ![]() ![]() при ![]() при ![]() ![]() ![]() таким образом, верный ответ: 4, 68. Решение (2 способ, М.В. Кузнецова и её ученики): запись числа71 в системе с основанием ![]() ![]() ![]() ![]() таким образом, искомые основания – делители числа 68; остается выбрать из них те, которые соответствуют другим условиям задачи среди чисел, оканчивающихся на 13 в системе счисления с основанием ![]() ![]() ![]() так что первый ответ: 68. остальные числа, окачивающиеся в этой системе на 13, имеют не менее 3-х знаков ( ![]() ![]() ![]() поэтому ![]() ![]() по условию в записи числа есть цифра 3, поэтому ![]() итак: ![]() ![]() ![]() таким образом, верный ответ: 4, 68.
Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: for i in range(4,100):# перебираем возможные основания x = 71 # число по условию 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[-2:]== "13": print(i, end=",") ответ: 4, 68. Решение (программа на Python, Б.С. Михлин): полная программа: for x in range(4, 72): # x - основание от 4 до 71 # (дальше перебирать нет смысла) # справа число 13 переведено в 10-ую систему if 71 % (x*x) == x + 3: print( x, end = ',' ) Ответ: 4, 68. Еще пример задания:Р-04. Укажите через запятую в порядке возрастания все основания систем счисления, в которых запись числа 86 оканчивается на 22. Решение (1 способ): Если число в системе с основанием ![]() ![]() это число можно представить в виде ![]() ![]() определим наибольшее возможное ![]() ![]() ![]() ![]() очевидно, что чем меньше ![]() ![]() ![]() ![]() здесь мы подставили ![]() ![]() остается перебрать все допустимые значения ![]() ![]() ![]() ![]() относительно ![]() ![]() получаем при ![]() ![]() при ![]() при ![]() ![]() ![]() при ![]() таким образом, верный ответ: 6, 42. Решение (2 способ, М.В. Кузнецова и её ученики): запись числа 86 в системе с основанием ![]() ![]() ![]() ![]() таким образом, искомые основания – делители числа 84; остается выбрать из них те, которые соответствуют другим условиям задачи среди чисел, оканчивающихся на 22 в системе счисления с основанием ![]() ![]() ![]() так что первый ответ: 42. остальные числа, окачивающиеся в этой системе на 22, имеют не менее 3-х знаков ( ![]() ![]() ![]() поэтому ![]() ![]() по условию в записи числа есть цифра 2, поэтому ![]() итак: ![]() ![]() ![]() переводя число 86 в системы счисления с основаниями ![]()
таким образом, верный ответ: 6, 42. Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: for i in range(3,100):# перебираем возможные основания x = 86 # число по условию 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[-2:]== "22": print(i, end=",") ответ: 6, 42. Решение (программа на Python, Б.С. Михлин): полная программа: for x in range(3, 86): # x - основание от 3 до 85 # (дальше перебирать нет смысла) # справа число 22 переведено в 10-ую систему if 86 % (x * x) == 2 * x + 2: print( x, end = ',' ) Ответ: 6, 42. Еще пример задания:Р-03. Укажите через запятую в порядке возрастания все основания систем счисления, в которых запись числа 94 начинается на 23. Решение: Из условия сразу видно, что искомое основание не меньше 4 (в записи есть цифра 3). Если запись числа 94 в некоторой системе счисления с основанием ![]() ![]() ![]() Предположим, что число четырехзначное. Минимальное допустимое четырехзначное число – 2300x, где ![]() ![]() ![]() На основании (2) и (3) делаем вывод, что число трехзначное, то есть ![]() ![]() ![]() Максимальное ![]() ![]() ![]() ![]() Если мы знаем ![]() ![]() ![]() ![]() ![]() Минимальное ![]() ![]() ![]() ![]() ![]() Таким образом, верный ответ: 6. Решение (программа на Python, А.Н. Носкин): можно решить задачу с помощью программы: for i in range(4,100):# перебираем возможные основания x = 94 # число по условию x_N = '' while x > 0:# перевод в N-ю систему x_N += str(x%i) x //= i x_N = x_N[::-1]# разворот числа if x_N[:2]== "23": print(i, end=",") ответ: 6. Еще пример задания:Р-2. Найти сумму восьмеричных чисел 178 +1708 +17008 +...+17000008, перевести в 16-ую систему счисления. Найдите в записи числа, равного этой сумме, третью цифру слева. Решение: Несложно выполнить прямое сложение восьмеричных чисел, там быстро обнаруживается закономерность: 178 + 1708 = 2078 178 + 1708 + 17008 = 21078 178 + 1708 + 17008 + 170008 = 211078 178 + 1708 + 17008 + 170008 + 1700008 = 2111078 178 + 1708 + 17008 + 170008 + 1700008 + 17000008 = 21111078 Переведем последнюю сумму через триады в двоичный код (заменяем каждую восьмеричную цифру на 3 двоичных): 100010010010010001112 Теперь разбиваем цепочку на тетрады (группы из 4-х двоичных цифр), начиная справа, и каждую тетраду представляем в виде шестнадцатеричной цифры 100010010010010001112 8 9 2 4 7 Таким образом, верный ответ (третья цифра слева): 2. Решение (программа на Python, А.Н. Носкин): решение задачи с помощью программы: a = "17" b = "1700000" summa = 0 while a <= b: summa += int(a,8) # перевод в 10ю систему a += "0" # добавляем 0 к числу-строке n16 = hex(summa)[2:] # перевод суммы в 16ю систему print(n16[2]) Ответ: 2. Решение (программа на Python, Б.С. Михлин): полная программа: x = 15 # 17 в 8-ой системе s = x # s - сумма в 10-ой системе for z in range( 1, 6 ): # z (zero) - количество нулей от 1 до 5 x *= 8 # добавление справа нуля к восьмеричному числу # увеличивает его в 8 раз s += x print( hex( s )[4] ) # с учетом префикса '0x' третий символ # (цифра) будет пятым с индексом 4 # print( hex( s ) ) # можно также найти третью цифру слева Ответ: 2. Еще пример задания:Р-01. Чему равно наименьшее основание позиционной системы счисления ![]() Решение: Поскольку в левой и в правой частях есть цифра 5, оба основания больше 5, то есть перебор имеет смысл начинать с ![]() Очевидно, что ![]() Для каждого «подозреваемого» ![]() ![]() ![]() ![]() Для ![]() ![]() ![]() ![]() так что ![]() Таким образом, верный ответ (минимальное значение ![]() Решение (программа на Python, А.Н. Носкин): можно решить задачу перебором с помощью программы (перебор начинаем с 6, так как цифра 5 есть в записи 225x, так и в записи 405y): for x in range(6,20):# перебираем основания X for y in range(6,20):# перебираем основания Y if (2*x**2+2*x+5) == (4*y**2+0*y+5): print(x) break ответ: 8. Еще пример задания:Р-00. Запись числа 3010 в системе счисления с основанием N оканчивается на 0 и содержит 4 цифры. Чему равно основание этой системы счисления N? Решение (1 способ, подбор): запись числа 30 в системе с основанием N длиннее, чем в десятичной (4 цифры против двух), поэтому основание N меньше 10 это дает шанс решить задачу методом подбора, переводя в разные системы, начиная с N = 2 до N = 9 переводим: 30 = 111102 = 10103 = … дальше можно не переводить, поскольку запись 10103 удовлетворяет условию: заканчивается на 0 и содержит 4 цифры можно проверить, что при N ≥ 4 запись числа 30 содержит меньше 4 цифр, то есть не удовлетворяет условию Ответ: 3. Решение (2 способ, неравенства): запись числа 30 в системе с основанием N содержит ровно 4 цифры тогда и только тогда, когда старший разряд – третий, то есть ![]() первая часть двойного неравенства ![]() ![]() вторая часть неравенства ![]() ![]() объединяя результаты пп. 2 и 3 получаем, что N = 3 заметим, что условие «оканчивается на 0» – лишнее, ответ однозначно определяется по количеству цифр Ответ: 3. Решение (программа на Python, А.Н. Носкин): можно решить задачу перебором с помощью программы: for i in range(2,36):# перебираем возможные основания x = 30 # число по условию x_N = '' while x > 0:# перевод в N-ю систему x_N += str(x%i) x //= i x_N = x_N[::-1]# разворот числа if x_N[-1]== "0" and len(x_N) == 4: print(i) break Ответ: 3. Решение (программа на Python, Б.С. Михлин): полная программа: for N in range(2, 10): # проверять основание N >=10 нет смысла # (будет два или один разряд) # проверка на четырёхзначность (в этой задаче проверка # окончания на ноль не обязательна) if N**3 <= 30 < N**4 and 30 % N == 0: print(N) Ответ: 3. |