16.12.2022

Задание 12. ЕГЭ по информатике. Редактор. Статград 25.10.22

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

НАЧАЛО

ПОКА НЕ нашлось (00)

заменить (011, 20)

заменить (022, 10)

заменить (01, 220)

заменить (02, 110)

КОНЕЦ ПОКА

КОНЕЦ

Известно, что исходная строка A содержала ровно два нуля – на первом и на последнем месте, а также поровну единиц и двоек. После выполнения данной программы получилась строка B, содержащая 40 единиц и больше 50 двоек. Какое наименьшее количество двоек может быть в строке B?

! Ошибка. Решение перебором ищем! Нужно проанализировать, как меняются подстроки в соответствии с алгоритмом. Например, подстрока 1112 меняется на 22211. Остается только подобрать количество 1 и 2. 

Решение подбором (Phyton)

Решение системой уравнений (Phyton)


13.11.2022

Язык Паскаль. Автомат обрабатывает натуральное число N > 1. Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 200]?

 Задача. Автомат обрабатывает натуральное число N > 1 по следующему алгоритму:

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

2. В конец записи (справа) дописывается вторая справа цифра двоичной записи.

3. В конец записи (справа) дописывается вторая слева цифра двоичной записи.

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

Пример. Дано число N = 11. Алгоритм работает следующим образом:

1. Двоичная запись числа N: 1011.

2. Вторая справа цифра 1, новая запись 10111.

3. Вторая слева цифра 0, новая запись 101110.

4. Результат работы алгоритма R = 46.

Для скольких значений N в результате работы алгоритма получится число, принадлежащее отрезку [150; 200]?

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

Будем искать число N, для которого результат работы алгоритма будет принадлежать отрезку [150; 200].

Обнулим искомый счетчик чисел r:=0.

Запустим цикл по подбираемым числам (по условию задачи это числа, больше 1, правую границу возьмем за 100, эту границу можно подбирать): 

for k:=2 to 100 do

За число N возьмем значение k.

Выполним перевод числа N в двоичную систему счисления: для этого пока число не равно 0, вычислим остаток от деления на 2 (это двоичная цифра), число уменьшим нацело в 2 раза. Чтобы получить двоичный код, превратим цифру n mod 2 в строку d процедурой str(n mod 2, d), и накопим строку s - это и будет двоичный код числа N, причем будем к вновь полученной цифре добавлять строку, тогда цифры двоичного кода будут получены в правильном порядке:

s:=d + s;

Далее по алгоритму, описанному в условии задачи, добавим к полученному коду предпоследний символ и второй символ, это и есть результат работы алгоритма:

s:=s+s[length(s)-1]+s[2];

Далее проверим, принадлежит ли полученный двоичный код результата диапазону чисел [150, 200].

Мы знаем, что числа из данного промежутка имеют длину 8 в двоичной коде, поэтому сравним принадлежность отрезку условием:

(length(s)=8) and (s>='10010110') and (s<='11001000')

Двоичный код числа 150 - это 10010110, а двоичный код числа 200 - это 11001000.

Если условие ИСТИНА, накопим искомый счетчик чисел r, также можно вывести само подходящее число N (это значение счетчика k, значение самой переменной N равно 0 из-за выполненного перевода).

Такую проверку осуществить быстрее, чем переводить полученную строку в десятичное значение.

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

var s,d:stringn,k,r:integer;

  begin

    r:=0;

    for k:=2 to 100 do

    begin

      n:=k; s:='';

      while n<>0 do

      begin

        str(n mod 2,d);

        s:=d+s;

        n:=n div 2;

      end;

      s:=s+s[length(s)-1]+s[2];

      if (length(s)=8)and(s>='10010110')and(s<='11001000')

          then begin print(k); r:=r+1; end;

    end;

    println('Количество чисел:',r);

  end.

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

Результат запуска

Ответ к задаче: 12 чисел

Способ 2 (используем модуль School и функции bin и dec)

Будем использовать функцию bin из модуля School для перевода числа в двоичную систему счисления, результатом будет строка двоичных цифр.

Далее в соответствие с алгоритмом работы автомата изменим получившуюся двоичную строку. После получения результата, переведем строку в десятичный код функцией dec и выполним проверку условия.

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

uses School;

var N,R,Kol:integer; B:string; 

  begin

    for N:=2 to 100 do

    begin

      B:=bin(N);

      B:=B+B[length(B)-1]+B[2];

      R:=dec(B,2);

      if R in [150..200] then Kol+=1;

    end;

    println(Kol);

  end.



18.10.2022

Язык Паскаль. PascalABC.NET. Массивы. Методы Where, Sum, Max

Задача. Дан массив целых чисел из N элементов. Верно ли, что сумма чисел, оканчивающихся на 7, меньше утроенного максимального нечетного значения?

Пример:

Массив mas = [29, -17, 7, 24, 27, 54]

Сумма чисел, оканчивающихся на 7: -17+7+27 = 17

Максимальное нечетное значение: 29

17 < 3*29, то есть 17 < 87, да, верно.

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

Опишем массив в блоке Var

var mas:array of integer;

Выделим N ячеек для хранения данных в массиве:

setLength(mas,N);

Введем данные с клавиатуры и сохраним в массиве:

for k:=0 to mas.Length-1 do

  begin

    readln(mas[k]);

  end;

Нумерация ячеек при таком объявлении ведется с 0 и, номер последней ячейки можно вычислить так: mas.length - 1, где mas.length это длина массива.

Найдем элементы, оканчивающиеся на 7: mas.Where(k->abs(k) mod 10 = 7)

Метод Where (где) находит элементы массива, удовлетворяющие условию.

В нашем случае условие такое: abs(k) mod 10 = 7  (модуль числа применяем для того, чтобы обработать в том числе и отрицательные числа).

Результатом работы метода Where является набор тех элементов, которые отвечают условию. Для решения нашей задачи нужно найденные элементы суммировать. Сделаем это методом Sum:

mas.Where(k->abs(k) mod 10 = 7).Sum

Найденное значение сохраним в переменной s.

s:=mas.Where(k->abs(k) mod 10 = 7).Sum;

Таким же образом будем находить нечетные значения в массиве, а затем применим метод Max:

mas.Where(k->k mod 2 <> 0).Max

Найденное значение сохраним в переменной m.

m:=mas.Where(k->k mod 2 <> 0).Max;

Выполним проверку: если s<m*3, то верно, иначе неверно.

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

var mas:array of integer;

    s,m,N,k:integer;

begin

  readln(N);

  setLength(mas,N);

  for k:=0 to mas.Length-1 do

  begin

    readln(mas[k]);

  end;

  s:=mas.Where(k->abs(k) mod 10=7).Sum;

  m:=mas.Where(k->k mod 2<>0).Max;

  if s<m*3 then println('Верно') else println('Неверно');

end.

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

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

Объявление и методы динамических массивов (читать)


30.09.2022

Язык Паскаль. Циклический алгоритм. Решение задач. 8 класс

В этой публикации рассмотрим решение некоторых задач по теме "Циклический алгоритм".

Задача 1. С клавиатуры вводится N натуральных чисел. Найти количество чисел, оканчивающихся на 3.

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

Воспользуемся оператором цикла с счетчиком для ввода N чисел.

for k:=1 to N do

begin

readln(a);

end;

Чтобы узнать, оканчивается ли число на 3, воспользуемся операцией mod (целый остаток от деления).

Пусть число a=463.

Последнюю цифру вычислим так: a mod 10.

Действительно, 463 mod 10 равно 3.

Будем копить количество чисел (переменная p), оканчивающихся на 3, оператором:

if a mod 10 = 3 then p:=p+1;

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

var k, N, p, a:integer;

begin

   writeln('Введите количество чисел N ');

   readln(N);

   p:=0;

   for k:=1 to N do

   begin

     writeln('Введите натуральное число ');

     readln(a);

    if a mod 10 = 3 then p:=p+1;

   end;

   writeln('Количество чисел, оканчивающихся на 3 равно ',p);

end.

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

Результат запуска

А что, если бы числа были не натуральные, а целые (как отрицательные, так и положительные), изменилось бы условие в операторе if?

Задача 2. С клавиатуры вводится N целых чисел. Найти среднее арифметическое двузначных чисел.

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

Воспользуемся оператором цикла с счетчиком для ввода N чисел.

for k:=1 to N do

begin

readln(a);

end;

Как узнать двузначное перед нами число или нет. Приведем примеры целых двузначных чисел: 23, -34, -99, 55.

Таким образом, минимальное двузначное положительное число это 10, а максимальное 99. 

Минимальное отрицательное двузначное число это -99, а максимальное -10.

двузначные числа

Значит для проверки условия, является ли число двузначным, можно воспользоваться условием:

(a>=10) and (a<=99) or (a>=-99) and (a<=-10)

то есть число отрицательное двузначное или положительное двузначное.

Ранее в этом блоге мы рассматривали способы проверки такого условия. Читайте статью "Как проверить, является ли число двузначным".

Если число a двузначное, то будем копить сумму s и количество p таких чисел (будем использовать операторные скобки для объединения этих двух действий).

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

var k, N, p, a, s:integer; sr:real;

begin

   writeln('Введите количество чисел N ');

   readln(N);

   p:=0; s:=0;

   for k:=1 to N do

   begin

     writeln('Введите целое число ');

     readln(a);

     if (a>=10) and (a<=99) or (a>=-99) and (a<=-10) then 

      begin

        p:=p+1;

        s:=s+a;

      end;

   end;

   sr:=s/p;

   writeln('Среднее значение равно ',sr);

end.

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

Результат запуска

А что, если ни одного двузначного числа мы не введем, что выведет программа?



29.09.2022

Язык Паскаль. Верно ли, что только одно число из пары кратно 3?

Задача. С клавиатуры вводятся два целых числа. Верно ли, что только одно число кратно 3?

Приведем примеры:

Пусть A = 12, B = 11. В этом случае ответ ДА, первое число кратно 3, а второе не кратно 3.

Пусть A = 11, B = 12. В этом случае ответ ДА, второе число кратно 3, а первое не кратно 3.

Пусть A = 12, B = 12. В этом случае ответ НЕТ, оба числа кратны 3.

Пусть A = 11, B = 11. В этом случае ответ НЕТ, оба числа не кратны 3.

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

1 способ

Проверим условие

Если число А кратно 3 и при этом число В не кратно 3 или число А не кратно 3, а число В кратно 3, то ответ ДА, иначе НЕТ.

if (A mod 3 = 0) and (B mod 3<>0) or (A mod 3<>0) and (B mod 3=0) then print('ДА') else print('НЕТ');

2 способ

Проверим условие

НЕВЕРНО, что условие (число А кратно 3) равносильно условию (число В кратно 3)

if not ((A mod 3 = 0) = (B mod 3 = 0)) then print('ДА') else print('НЕТ');

3 способ

Для проверки такого условия можно использовать логическую операцию Исключающее ИЛИ (xor), по сути она равна логическому неравенству.

if (A mod 3 = 0) xor (B mod 3 = 0) then print('ДА') else print('НЕТ');

Если ввести обозначения двум условиям X и Y, то верно следующее:

not (X = Y) равно (X xor Y)