Задание №5

ЕГЭ-2023. Задание 5

Тема: Формальное исполнение простого алгоритма, записанного на естественном языке, или умение создавать линейный алгоритм для формального исполнителя с ограниченным набором команд, или умение восстанавливать исходные данные линейного алгоритма по результатам его работы. Время выполнения 4 минуты.

Разбор задания № 5 ЕГЭ-2023. Демо.

Эту задачу можно решить с помощью я.п.

Python:

q=4

t=True

while t:

         n=bin(q)

         n=str(n)

         n=n.replace('0b','',1)

         k=n.count('1')

         if k%2==0:

                   n +='0'

                   n=n.replace(n[:2],'10',1)

         else:

                   n +='1'

                   n=n.replace(n[:2],'11',1)

         r = int(n,2)

         if r>40:

                  print(q)

                  break

         q +=1

Ответ: 16

Задание 5 ЕГЭ-2024 Демо

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

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

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

а) если число N делится на 3, то к этой записи дописываются три последние двоичные цифры;

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

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

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

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

Решение:

uses school;

begin

  var mn:=10**10;

  for var n:=4 to 1000 do

  begin

    var x:=bin(n);

    if n mod 3 = 0 then

      x +=x[x.Count-2:]

    else

    begin

      var y:=bin((n mod 3)*3);

      x +=y;

    end;

    var rez:=Dec(x,2);

    if rez>151 then

      mn:=min(mn,rez);

  end;

print(mn);  

end.

Ответ: 163

Задача 1.

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

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

2) К этой записи дописываются справа ещё два разряда по следующему правилу: если N чётное, в конец числа (справа) дописывается 01, в противном случае справа дописывается 10.

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

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

Решение.

Система программирования PascalABC.net постоянно модернизируется, поэтому ниже покажу решение этой задачи указанным я.п.  При этом буду использовать модуль uses School (2018 - 2019 гг)

Сам алгоритм решения прост: перебираем числа от 82 до 100.

И как только число  отвечает поставленным требования - перебор останавливаем и выводим найденное значение.

uses School;

begin

for var i:=82 to 100 do

  begin

    var n:=i;

    var nn:= n shr 2;

    var k_ed:=bin(nn).Count(d->d='1') mod 2;

    if k_ed=0 then begin

      if((n and 1)=1) and ((n and 2)<>2) then begin

        println(n);

        break;

    end

    end

    else begin

      if((n and 1)<>1) and ((n and 2) = 2) then begin

        println(n);

        break

      end;

      end

  end;

end.

Ответ: 86

Второй способ решения данной задачи (прямой):

uses school;

begin

for var n:=2 to 1000 do

begin

var x:=bin(n);

  if n mod 2=0 then

    x +='01'

  else

    x +='10';

var y:=dec(x,2); 

if y>81 then begin

   println(y);

   break

   end;

end;

end.

решение на я.п. C/C++ и Python

я.п. Python:

for i in range(82,100):

            n = i

            n = n >> 2

            value = bin(n)

            cnt = value.count('1')

            nn = bin(i)

            nn = nn[len(nn)-2:]

            if cnt%2==0:

                    if nn=='01':

                                  println(i)

                                  break

            else:

                    if nn=='10':

                                  print(i)

                                  break

2-ой вариант решения (Python):

for i in range(82,100):

            n = i

            n = n >> 2

            value = bin(n)

            cnt = value.count('1')%2

            if cnt==0:

                    if (i & 1)==1 and (i & 2)==0:

                                  println(i)

                                  break

            else:

                    if (i & 1)==0 and (i & 2)==2:

                                  print(i)

                                  break

я.п. C/C++:

#include <bits/stdc++.h>

using namespace std;

int count_1(int x)

{

    int k=0;

    while (x)

    {

      if(x & 1)

            k ++;

      x = x>>1;

    }

    return k;

}

int main()

{

    int n,nn,cnt;

    for(int i=82;i<100;i++){

        n = i;

        nn = n >>2;

        cnt = count_1(nn)%2;

        if(cnt==0){

            if((n & 1)==1 && (n &2)!=2){

                cout<<i<<endl;

                break;

            }

        }

        else{

            if((n & 1)!=1 && (n & 2)==2){

                cout<<i<<endl;

                break;

            }

        }

    }

    return 0;

}

Задача 2.

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

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

2) К этой записи дописываются справа ещё два разряда по следующему правилу:

а) складываются все цифры двоичной записи числа N, и остаток от деления суммы на 2 дописывается в конец числа (справа). Например, запись 11100 преобразуется в запись 111001;

б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы её цифр на 2.

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

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

Решение

Рассмотрим особенности решения задачи на примере ввода одного числа (N), например, 17.

Перебирая числа в диапазоне до 100, мы найдем первое (это и будет наименьшее) число, которое больше 92.

И это будет число 24, после преобразования по данному алгоритму даст число 96.

2 способ решения задачи - как при решении задачи 2.

Нахождение количества единиц в числе - смотри выше.

Прежде, чем определимся со способом решения задачи, давайте посмотрим один пример.

n = 17, двоичная запись которого - 10001.

n = 2*n + остаток от деления количества единиц на 2. Какой эффект: 1000100! (красный цвет - в этот разряд вписан остаток от деления количества единиц на 2). Следовательно, 2*n - увеличение разряда исходного числа или сдвиг числа на один разряд влево ! А всего число было увеличено на два разряда, так как алгоритм дважды повторяет это действие. Что означает "+ остаток..."? Это запись в последний разряд значения ("+" означает логическую операцию дизъюнкция).

Итак, на Питоне наша задача будет выглядеть так:

for i in range(1,50):

          n = i

          cnt = bin(n).count('1') % 2

          n = 2*n + cnt

          cnt = bin(n).count('1') % 2     #повторяем второй раз, как и написано в задаче

          n = 2*n + cnt

          if n > 92:

                    print(i)

                    break

Ответ: 24

решение я.п. PascalABC.net и C/C++

я.п. PascalABC.net:

uses School;

begin

  for var i:=1 to 50 do

  begin

    var n:=i;

    var cnt:=bin(n).Count(d->d='1') mod 2;

    n:=2*n + cnt;

    cnt:=bin(n).Count(d->d='1') mod 2;

    n:=2*n + cnt;

    if n>92 then begin

      println(i);

      break;

    end;

  end;

end.

я.п. C/C++:

#include <bits/stdc++.h>

using namespace std;

int count_1(int x)

{

    int k=0;

    while (x)

    {

      if(x & 1) k ++;

      x = x>>1;

    }

    return k;

}

int main()

{

    int n,cnt;

    for(int i=1;i<50;i++){

        n = i;

        cnt = count_1(n)%2;

        n =2*n + cnt;

        cnt = count_1(n)%2;

        n =2*n + cnt;

        if(n>92){

            cout<<i<<endl;

            break;

        }

        }

    return 0;

}

Задача 3

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

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

2) К этой записи дописываются ещё несколько разрядов по следующему правилу:  если число чётное, то в конец числа (справа) дописывается 01, в противном случае - слева дописывается 1 и справа дописывается 10.

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

Например, N = 13; после выполнения пункта 1 получим запись 1101. После выполнения пункта 2 получаем число 1110110. Полученная таким образом запись является двоичной записью искомого числа R.

Укажите такое наименьшее число N, для которого результат работы данного алгоритма больше числа 214

В ответе запишите это число в десятичной системе счисления.

Решение я.п. Python:

for i in range(1,50):

      n = i

      if i%2==0:

            n = 2*n + 1

      else:

            n = ((n + 32) << 2) + 2

      if n>214:

            print(i)

            break

Ответ: 23

решение я.п. С/С++ и PascalABC.net

я.п. C/C++:

#include <bits/stdc++.h>

using namespace std;

int main()

{

    for(int i=1;i<50;i++){

        int n = i;

        if(i%2==0){

            n = 2*n + 1;

        }

        else

            (n = (n + 32) << 2) + 2;

        if(n>214){

            cout<<i<<endl;

            break;

        }

    }

    return 0;

}

я.п. PascalABC.net:

uses School;

begin

  for var i:=1 to 50 do

  begin

    var n:=i;

    if i mod 2=0 then

      n:=2*n + 1

    else

      n:=((n + 32)shl 2)+ 2;

    if n>214 then

    begin

      println(i);

      break;

    end;

  end;

end.

Задача 4

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

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

2. К этой записи дописываются справа ещё три разряда по следующему правилу:

а) если число чётное, то в конец числа (справа) дописывается 00, в противном случае дописывается 10;

б) если в полученном числе количество единиц чётное, то справа дописывается 0, в противном случае дописывается 1.

Например, N = 13. После выполнения пункта 1 получим запись 1101. После выполнения пункта получаем число 110110. После выполнения пункта получаем число 1101100.

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

Укажите количество чисел R, которые принадлежат диапазону [130; 350] и могут являться результатом работы алгоритма.

Ответ: 27

проверь себя

Решение я.п. Python:

cnt = 0

for i in range(1,50):

         n = i

         if i%2==0: n = n << 2

         else:      n = (n << 2) + 2

         value = bin(n)

         k = value.count('1')%2

         if k==0: n = n << 1

         else:    n = (n << 1) + 1

         if n>=130 and n<=350:

                       cnt +=1

print(cnt)

Решение я.п. PascalABC.net:

uses School;

begin

  var cnt:=0;

  for var i:=1 to 50 do

  begin

    var n:=i;

    if n mod 2=0 then

      n:=n shl 2

    else

      n:=(n shl 2) + 2;

    var val:=bin(n);

    var k:=val.count(d->d='1') mod 2;

    if k=0 then

      n:= n shl 1

    else

      n:=(n shl 1) + 1;

    if (n in 130..350) then

      cnt +=1;

  end;

  println(cnt);

end.

Решение я.п. С/С++:

#include <bits/stdc++.h>

using namespace std;

int count_ed(int x)

{

    int k = 0;

    while(x){

        k +=1;

        x = x >> 1;

    }

    return k;

}

int main()

{

    int cnt = 0;

    for(int i=1;i<50;i++){

        int n = i;

        if (n%2==0)

            n = n <<2;

        else

            n = (n << 2) + 2;

        int value = count_ed(n)%2;

        if (value==0)

            n = n << 1;

        else

            n = (n << 1) + 1;

        if(n>=130&&n<=350)

            cnt +=1;

    }

    cout<<cnt<<endl;

    return 0;

}

Задача 5

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

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

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

   а) если сумма цифр в двоичной записи числа чётная, то к этой записи слева дописывается 10;

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

   в) инвертируем крайний правый разряд.

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

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

Решение:

uses school;

begin

  for var n:=4 to 1000 do Begin

    var x:=bin(n);

    var k_ed:=x.Count(d -> d='1');

    if k_ed mod 2=0 then

      x :='10' + x

    else

      x := '11' + x;

    var y:=1;

    var r:=dec(x,2);

    r:=r xor y;

    if r>120 then begin

      println(n);

      break

    end;

  end;

end.

Результат: 26

Задача 6.

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

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

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

а) если число N  делится на 4, то к этой записи дописываются две последние четверичные цифры;

б) если число N на 4 не делится, то остаток от деления умножается на 2, переводится в четверичную запись и дописывается в конец числа.

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

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

Укажите максимальное число N, после обработки которого с помощью этого алгоритма получается число R меньшее 261.

Решение я.п. PascalABC.net

Ответ: 61

uses school;

function ss_4(x: integer):string;

begin

  var sl:='';

  while x>0 do begin

    var ost:=IntToStr(x mod 4);

    sl := ost + sl;

    x:=x div 4;

  end;

  ss_4:=sl;

end;

begin

  var mx:=0;

  for var n:=16 to 1000 do begin

    var x:=ss_4(n);

    var l:=x.Length;

    if n mod 4 = 0 then

      x +=x[l-1:]

    else begin

      var z:=ss_4(2*(n mod 4));

      x +=z;

    end;

    var r:=dec(x,4);

    if r<261 then

      mx:=max(mx,n)

  end;

  println(mx);

end.

Решение я.п. Python

Ответ: 61

def ss_4(x):

    sl=''

    while x>0:

        sl =str(x%4) +sl

        x //=4

    return sl

mx=0

for n in range(4,1000):

    x = ss_4(n)

    if n%4==0:

        x +=x[-2:]

    else:

        y = ss_4(n%4*2)

        x +=y

    r = int(x,base=4)

    if r<261:

        mx=max(mx,n)

print(mx)

Задачи для самостоятельного решения

Задача 1с.

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

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

2. К этой записи дописываются справа ещё три разряда по следующему правилу:

а) если число чётное, то в конец числа (справа) дописывается 00,  в противном случае дописывается 10;

б) если в полученном числе количество единиц чётное,  то справа дописывается 0 , в противном случае дописывается 1.

Например, N = 13. После выполнения пункта 1 получим запись 1101. После выполнения пункта получаем число 110110. После выполнения пункта 26 получаем число 1101100.

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

Укажите количество чисел R, которые принадлежат диапазону [160; 630] и могут являться результатом работы алгоритма.

ответ

59

Задача 2с

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

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

2. К этой записи дописываются справа ещё два разряда по следующему правилу: если N чётное, в конец числа (справа) дописываются два нуля, в противном случае справа дописываются две единицы.

Например, двоичная запись 1011 числа 11 будет преобразована в 101111.  

Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью числа R - результата  работы данного алгоритма.

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

ответ

24

Задача 3с

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

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

2. Складываются все цифры двоичной записи, и остаток от деления суммы на 2 дописывается в конец числа (справа).

3. Над полученной записью производится действие - справа дописывается остаток от деления суммы цифр на 2.

Например, двоичная запись 101 числа 5 будет преобразована в 101000.

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

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

ответ

17

Задания ЕГЭ прежних лет

Задание-5