Почему ответ не выводится?
Сколько существует целых значений числа A, при которых формула
((x < A) → (x^2 < 100)) ∧ ((y^2 ≤ 64) → (y ≤ A))
тождественно истинна при любых целых неотрицательных x и y?
Мой код:
for a in range(0,1000):
f=True
for x in range(1,100):
for y in range(1,100):
if ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))) == False:
f=False
if f == True:
print(a)
Я не вижу в нем ошибки
Ответы (2 шт):
Для начала нужно сделать как-то так
count = 0
for a in range(0,1000):
f=True
for x in range(1,100):
for y in range(1,100):
if ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))) == False:
if f == True:
count += 1
print(a)
f=False
print(count)
Но у тебя какие-то странные значения, почему ты выбрал такой диапазон, для А - 1000 и по 100 для x и y? Есть какое-то дополнительное условие?
Поправить ваш код не сложно. Нужно исправить число пробелов в последних двух строках. Работает как задумано:
for a in range(0,1000):
f=True
for x in range(1,100):
for y in range(1,100):
if ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))) == False:
f=False
if f == True:
print(a)
Некоторые доработки. Вы знаете логику, значит поймёте пару правил:
expr == False -> not expr
expr == True -> expr
Правила применимы только если expr имеет булев тип. Так что ещё правило: избегайте неявного приведения выражений другого типа к булеву.
Следующее правило: все операторы в коде одного уровня абстракции. Сейчас не так: смешано вычисление f (низкий уровень), проверка и печать (высокий уровень). Прячем вычисление:
def check(a):
f=True
for x in range(1,100):
for y in range(1,100):
if not ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))):
f=False
return f
for a in range(0,1000):
if check(a):
print(a)
Оптимизация: если единственное действие цикла присвоение константы, прерываем цикл немедленно. Функция check делает единственное действие, выходим из неё быстро:
def check(a):
for x in range(1,100):
for y in range(1,100):
if not ((not (x < a) or (x ** 2 < 100)) and (not(y ** 2 <= 64) or (y <= a))):
return False
return True
Бизнес логика смешана с вычислениями. Разделяем:
def formula(a, x, y):
# ((x < A) → (x^2 < 100)) ∧ ((y^2 ≤ 64) → (y ≤ A))
return (not (x < a) or (x ** 2 < 100)) and (not (y ** 2 <= 64) or (y <= a))
def check(a):
for x in range(1,100):
for y in range(1,100):
if not formula(a, x, y):
return False
return True
Знай и люби библиотеку языка. all проверяет что все элементы истинны:
def check(a):
return all(
formula(a, x, y)
for x in range(1,100)
for y in range(1,100)
)
Всё вместе:
def formula(a, x, y):
# ((x < A) → (x^2 < 100)) ∧ ((y^2 ≤ 64) → (y ≤ A))
return (not (x < a) or (x ** 2 < 100)) and (not (y ** 2 <= 64) or (y <= a))
def check(a):
return all(
formula(a, x, y)
for x in range(1, 100)
for y in range(1, 100)
)
for a in range(1000):
if check(a):
print(a)
$ time python formula.py 8 9 10 real 0m0.552s user 0m0.548s sys 0m0.000s