17.04.2024

Задание 14. ЕГЭ по информатике. Значение арифметического выражения записали в системе счисления с основанием 3

Задача. Значение арифметического выражения: 911 * 320 – 39 – 27 записали в системе счисления с основанием 3. Сколько цифр 2 содержится в этой записи?

Воспользуемся алгоритмом обработки цифр натурального числа, ранее рассмотренном в данном блоге.

Пока число не равно 0, будем вычислять 3-ю цифру (d = n % 3) и уменьшать число в 3 раза (n = n // 3).

Если цифра числа равна 2, то будем увеличивать счетчик цифр k.

Программа решения задачи на языке Python

n = 9**11 * 3**20 - 3**9 - 27

k = 0

while n!=0:

    d = n % 3

    n = n // 3

    if d == 2:

        k+=1

print(k)

Ответ: 38


Задание 14. ЕГЭ по информатике. Операнды арифметического выражения записаны в системах счисления с основанием 17

 Задача. Операнды арифметического выражения записаны в системах счисления с основанием 17:

10x017 + F0xF017

В записи чисел переменной x обозначена неизвестная цифра из алфавита 17-ричной системы счисления. Определите наименьшее значение x, при котором значение данного арифметического выражения кратно 13. Для найденного значения x вычислите частное от деления значения арифметического выражения на 13 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.

Как будем решать задачу

  1. Запустим цикл по числу x в диапазоне цифр 17-ой системы счисления (от 0 до G)
  2. Выполним перевод чисел в 10-ю систему счисления функцией int()
  3. Вычислим значение арифметического выражения
  4. Выведем число  x  и частное от деления значения арифметического выражения на 13, если значение выражения кратно числу 13
Программа решения задачи на языке Python

for x in '0123456789ABCDEFG':

    a1 = int('10'+x+'0',17)

    a2 = int('F0'+x+'F0',17)

    s = a1 + a2

    if s % 13 == 0:

        print(x, s//13)

Результат запуска программы

Наименьшее x = 2, а частное от деления значения выражения на число 13 равно 96815

Ответ: 96815

Ограничение данной программы состоит в использовании функции int(): максимальное основание, для которого допустим перевод числа, это 36, минимальное допустимое основание это 2.




16.04.2024

Задание 5. ЕГЭ по информатике. На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R

Задача. На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.

1.    Строится двоичная запись числа N.

2.    Далее эта запись обрабатывается по следующему правилу:

а) если число N чётно, то справа приписывается «01»;

б) если число N нечётно, то к этой записи слева приписывается 1 и справа приписывается «01».

Полученная таким образом запись является двоичной записью искомого числа R.

3.    Результат переводится в десятичную систему и выводится на экран.

Укажите минимальное число R, большее 150, которое может быть получено в результате обработки натурального числа N.  В ответе запишите это число в десятичной системе счисления.

Приведем решение задачи на языках Паскаль и Python. В программе на языке Паскаль будем использовать функции модуля school для перевода чисел в двоичную/десятичную системы счисления (подобная задача ранее разбиралась в данном блоге).

Как будем решать задачу

  1. Запустим цикл по натуральному числу N от 1 до 100 (правая граница промежутка изменяемая, будем проводить эксперимент).
  2. Число N переведем в двоичную систему счисления.
  3. Обработаем двоичную запись числа в соответствие с алгоритмом.
  4. Полученную двоичную запись переведем в десятичную систему счисления R.
  5. Если R>150, выведем таблицу значений N и R на экран.

Далее проанализируем полученные результаты, нам необходимо найти наименьший результат, больший 150, для какого-либо N.

Программа решения задачи на языке Паскаль

uses school;

var n,r:integer; b:string;

begin

  for n:=1 to 100 do

  begin

    b:=bin(n);

    if n mod 2 = 0 then b:=b + '01'

    else b:='1'+b+'01';

    r:=dec(b, 2);

    if r>150 then println(n,r);

  end;

end.

Запустим программу для промежутка чисел N от 1 до 100. Обратим внимание, что по мере возрастания числа N, результаты R ведут себя произвольно, первое по счету R, очевидно, не является ответом. Необходимо выполнить эксперимент и запускать цикл по числу N до 200, 300, наблюдать, как ведут себя результаты (>150). Ответом является число 153.


Ответ: 153

В программу на языке Python внесем изменения: запустим цикл до 1000 и сохраним результаты, большие 150, в список, в качестве ответа возьмем минимум. Можно увеличивать правую границу и видеть, что минимум не меняется.

Программа решения задачи на языке Python

a = []

for n in range(1,1001):

    b = bin(n)[2:]

    if n % 2 == 0:

        b = b + '01'

    else:

        b = '1' + b + '01'

    r = int(b, 2)

    if r>150:

        a.append(r)

        #print(n, r)

print(min(a))

Ответ: 150

04.03.2024

Эксперимент. Решаем 5 задач за час (нестандартные задачи на питон)

Про интерес. Задала гуглу такой запрос:

нестандартная задача питон

И нашла такую статью: "Пять задач, которые хорошо бы уметь решать за час"

запрос гуглу

Автор предлагает решить 5 задач за 1 час.

Конечно захотелось проверить свои силы ))))

Вот эти задачи:

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33]

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число. Например:

 [61, 228, 9] -> 961228

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

Постарайтесь решить эти задачи за час.

Итак!

Решения

Первая задача

У вас есть массив чисел. Напишите три функции, которые вычисляют сумму этих чисел: с for-циклом, с while-циклом, с рекурсией.

def sum_for(a):

    s = 0

    for k in a:

        s+=k

    return s

def sum_while(a):

    s = 0

    k = 0

    while k<len(a):

        s+=a[k]

        k+=1 

    return s

def sum_rec(a):

    if len(a)==1: return a[0] 

    else: return sum_rec(a[:-1])+a[-1]

x = [100,200,-300,100,-400,10000]

print(sum_for(x))

print(sum_while(x))

print(sum_rec(x))

вывод

9700

9700

9700

Вторая задача

Напишите функцию, которая создаёт комбинацию двух списков таким образом:

[1, 2, 3] (+) [11, 22, 33] -> [1, 11, 2, 22, 3, 33]

def f(a,b):

    r = []

    for k in range(min(len(a),len(b))):

        r.append(a[k])

        r.append(b[k])

    return r 

x = [1,2,3,4,5,6]

y = [11,22,33,44,55]

print(f(x,y))

вывод

[1,11,2,22,3,33,4,44,5,55]

Третья задача

Вычислите первые 100 чисел Фибоначчи. (Напишите код.)

x = [0]*100

x[0] = 0 

x[1] = 1 

for k in range(2,len(x)):

    x[k] = x[k-1] + x[k-2]

print(x)

вывод

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026]

Четвёртая задача

У вас есть массив чисел, составьте из них максимальное число.

Например: [61, 228, 9] -> 961228

from itertools import *

a = [9,10,10,345,11,9]

m = 0

for x in permutations(a):

    s = int(''.join(map(str,x)))

    m = max(m,s)

print(m) 

вывод

99345111010

К слову, абсолютно неэффективная программа.

Пятая задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

m = set()

for k1 in range(1,10):

    for t1 in ' +-':

        for k2 in range(k1+1,10):

            for t2 in ' +-':

                for k3 in range(k2+1,10):

                    for t3 in ' +-':

                        for k4 in range(k3+1,10):

                            for t4 in ' +-':

                                for k5 in range(k4+1,10):

                                    for t5 in ' +-':

                                        for k6 in range(k5+1,10):

                                            for t6 in ' +-':

                                                for k7 in range(k6+1,10):

                                                    for t7 in ' +-':

                                                        for k8 in range(k7+1,10):

                                                            for t8 in ' +-':

                                                                for k9 in range(k8+1,10):

                                                                    for t9 in ' +-':

                                                                        s= str(k1)+str(t1)

                                                                        s+=str(k2)+str(t2)

                                                                        s+=str(k3)+str(t3)

                                                                        s+=str(k4)+str(t4)

                                                                        s+=str(k5)+str(t5)

                                                                        s+=str(k6)+str(t6)

                                                                        s+=str(k7)+str(t7)

                                                                        s+=str(k8)+str(t8)

                                                                        s+=str(k9)+str(t9)

                                                                        w=''

                                                                        for y in s:

                                                                            if y!=' ':

                                                                                w+=y

                                                                        if w[-1] in '+-': w = w[:-1]

                                                                        r = w[0]

                                                                        for q in range(1,len(w)):

                                                                            if w[q] in '+-':

                                                                                r=r+'s'+w[q]

                                                                            else:

                                                                                r=r+w[q]

                                                                        summ = sum(list(map(int,r.split('s'))))  

                                                                        if summ==100:

                                                                            m.add(w)

print(len(m),m)   

вывод

11 {'1+2+3-4+5+6+78+9', '12+3+4+5-6-7+89', '1+2+34-5+67-8+9', '12+3-4+5+67+8+9', '123+45-67+8-9', '123-4-5-6-7+8-9', '1+23-4+56+7+8+9', '1+23-4+5+6+78-9', '12-3-4+5-6+7+89', '123+4-5+67-89', '123-45-67+89'}

Итого

Начало: 19:49

Конец: 20:58

Потрачено: 1 час 9 мин

То чувство, когда применяешь для решения задач что-то по-быстрому, главное решить... и каково снова быть на экзамене?

01.03.2024

Задание 12. ЕГЭ по информатике. Replace. Дана строка, состоящая из 400 цифр 5. Сколько пятёрок было удалено за время обработки строки (программа на языке Python)

 Задача.     Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

заменить (v, w) заменяет подстроку v на w (первое слева вхождение)

нашлось (v) проверяет, нашлась ли подстрока v

Дана программа для исполнителя Редактор:

ПОКА нашлось (555) ИЛИ нашлось (333)

  ЕСЛИ нашлось (555)

    ТО заменить (555, 3)

    ИНАЧЕ заменить (333, 5)

  КОНЕЦ ЕСЛИ 

КОНЕЦ ПОКА 

Дана строка, состоящая из 400 цифр 5. Сколько пятёрок было удалено за время обработки строки по этой программе?

Это пример задачи из ЕГЭ по информатике - задание № 12.

Как будем решать задачу?

Будем использовать метод replace(v,w, x) для замены подстроки v на w, параметр x указывает на количество замен,  в нашем случае x = 1. Если параметр x не указывать, будут выполнены все возможные замены.

Чтобы вычислить количество удаленных '5' за время обработки строки, найдем ту команду, которая заменяет '5' на другие символы - это команда: заменить (555, 3), за счет этой команды удаляются три '5'. В этом месте алгоритма будем увеличивать счетчик удаленных пятерок на 3.

Программа решения задачи на языке Python

s = '5' * 400

k = 0

while '555' in s or '333' in s:

    if '555' in s:

        s = s.replace('555','3',1)

        k+=3

    else:

       s = s.replace('333','5',1)

print('k =',k)

Вывод результата: