Позиционные системы счисления
Скачать 0.83 Mb.
|
Пример задания:Р-25. (демо-2021) Значение арифметического выражения: 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. Решение (использование программы на Java, М. Коротков): язык Java позволяет работать с большими числами с помощью типа BigInteger; может быть написана программа, которая вычисляет значение арифметического выражения и методом деления в столбик определяет все цифры его записи в семеричной системе счисления; шестёрки считаем с помощью счётчика amt6: полная программа: 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); } } Ответ: 13. Ещё пример задания:Р-24. (М.В. Кузнецова) Значение арифметического выражения: 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. |