@Xlemon2

Где ошибка в коде?

Условие задачи: Для какого наибольшего целого числа А выражение ((2*x+y>A)or(y>20)or(x>30)) тождественно истинно, т. е. принимает значение 1 при любых целых неотрицательных x и y? Проблема (выводит все отрицательные числа)
Вот код:
for A in range(-100, 1000):
    f = 0
    for x in range(0, 101):
        for y in range(0, 101):
            if ((2*x+y>A)or(y>20)or(x>30))==False:
                f=1
                break
        if f == 1:
            break
    if f == 0:
        print(A)
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix
yellow
Проблема (выводит все отрицательные числа)


Так а в чем проблема? На этом выражении ответом и будут только отрицательные числа.

Если взять A = 0, а x,y = 0, то получается условие 2*0+0 > 0 -> False
Если взять A = 1, а x,y = 0, то получается условие 2*0+0 > 1 -> False
Ну и так далее. Все проверки, где A = 0 будут провалены, т.к. левое выражение будет всегда = 0 в начале итерации.

Ответ не может быть положительным числом.

Если под ошибкой подразумевается вывод всех чисел - можно просто запоминать последнее/максимальное число и выводить его в конце
if f == 0:
        last_A = A

# после всех циклов
print(last_A)
Ответ написан
@o5a
Т.к. по условию требуется найти наибольшее значение A, то проще идти по первому циклу в обратном направлении, от большего числа к меньшему, и добавить прерывание цикла при первом же найденном значении A, удовлетворяющем условию. Т.е. изменить примерно так:
for A in range(1000, -101, -1):
    f = 0
    for x in range(0, 101):
        for y in range(0, 101):
            if ((2*x+y>A) or (y>20) or (x>30))==False:
                f=1
                break
        if f == 1:
            break
    if f == 0:
        print(A)
        break


Но вообще (если условия приведены верные), задача решается без необходимости этих вычислений, простой логикой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы