Задание 15
Задание 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. Их может быть много, но, так как нужно минимальное, будем брать первое число.