Задание 15 (демо-2023). Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m».

    Для какого наименьшего натурального числа А формула

(ДЕЛ(x, 2) → ¬ДЕЛ(x, 3)) \/ (x + A ≥ 100)

тождественно истинна (т.е. принимает значение 1) при любом натуральном значении переменной х?

    Решение задания на языках PascalABC.NET и Python приведено ниже.

PascalABC.NET

### uses School;

foreach var A in range(1,500) do begin

  var f:=1;

  foreach var x in range(1,1000) do

    if (x.D(2) <= x.ND(3))or(x+A>=100)=False then f:=0;

  if f=1 then println(A); end;

Python

for A in range(1,500):

  f=1

  for x in range(1,1000):

    if (((x%2==0) <= (x%3!=0)) or (x+A >=100) )== False:

      f=0

  if f==1:

    print(A)

 

    Решение в обоих языках начинается аналогично: в двух циклах по A и x перебираются числа от 1 до 500 и от 1 до 1000 соответственно. Переменная f играет роль флага о том, что для текущего A удовлетворяют все значения x.

    В данном решении на PascalABC.NET, чтобы упростить синтаксис условия проверки, был подключён модуль SF (три решётки ###) и модуль School. Это сделано для того, чтобы использовать функции .Divs(a) и .NotDivs(a), которые возвращают True, если число x делится (не делится) на a. То есть они аналогичны записям

  x mod 2 = 0;

  x mod 3 <> 0;

    Запись ### вначале позволяет многие функции сильно сократить: в нашем случае функции x.Divs(2) и x.NotDivs(3) до функций x.D(2) и x.ND(3). В Python таких упрощений провести невозможно, поэтому используются стандартные условия x%2==0 и x%3!=0, которые также достаточно компактны.

    Если после проверки всех чисел x флаг f равен 1, то печатаем число A. Их может быть много, но, так как нужно минимальное, будем брать первое число.


Modifié le: lundi 22 mai 2023, 19:07