ЦУЙУ. Позиционные системы счисления
Скачать 0.86 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. Ещё одно решение на 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. здесь «bi» длинным, а ** означает возведение в степень Ответ: 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. |