Как я могу распечатать заявление, только если уравнение не выполняется?

Я пытаюсь найти, для каких значений x и y в диапазоне (-10,10) выполняется уравнение, и, если решение не найдено, я пытаюсь вывести «Нет решения».

Однако, при попытке вывести «No solution», я либо получаю «No Solution» в каждой отдельной итерации, и в конце выдает «No solution» независимо от того, удовлетворен ли цикл for.

У меня возникли проблемы с выяснением, как добавить в мое заявление для печати, когда нет решения.

Вот что я имею до сих пор:

''' Read in first equation, ax + by = c '''
a = int(input())
b = int(input())
c = int(input())

''' Read in second equation, dx + ey = f '''
d = int(input())
e = int(input())
f = int(input())

for x in range(-10,10):
    for y in range(-10,10):
        if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
            print(x, y)
            break

Всего 6 ответов


Вы можете использовать предложение else с циклом for . Он выполняется только в том случае, если цикл for не прерывается прерыванием.

for i in range(3):
    print(i)
else:
    print('hello')
# prints:
0
1
2
hello

for i in range(3):
    print(i)
    if i==1:
        break
else:
    print('world')
# prints:
0
1

Обратите внимание, что world не печатается, потому что цикл был прерван оператором break .

Однако, поскольку у вас есть 2 для циклов, ваш оператор break будет разрывать только самый внутренний цикл. Чтобы разорвать оба цикла, вы можете использовать флаг, чтобы остановить выполнение.

HALT = False
for x in range(-10,10):
    for y in range(-10,10):
        if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
            print(x, y)
            HALT = True
            break
    if HALT:
        break
else:
    print('No solution')

Используя itertools.product , вы можете обойтись без внутреннего цикла и флага HALT .

from itertools import product


for x, y in product(range(-10, 10), repeat=2):
    if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
        print(x, y)
        break
else:
    print('No solution')

Вы можете встроить свою логику в функцию для лучшего управления потоком (например, оператор return немедленно выйдет из функции)

'''Read in first equation, ax + by = c'''
a = int(input())
b = int(input())
c = int(input())

''' Read in second equation, dx + ey = f '''
d = int(input())
e = int(input())
f = int(input())


def find_solution():
    for x in range(-10, 10):
        for y in range(-10, 10):
            if ((a * x) + (b * y)) == c and ((d * x) + (e * y)) == f:
                return x, y

solution = find_solution()
if solution is not None:
    print(solution)
else:
    print("No solutions found")

Сделайте ядро ​​«поиск решения» логикой функцией и верните либо первое решение, либо None . Кстати, функции, которые не имеют явного return <...> автоматически возвращают None .

Затем вызовите эту функцию и напечатайте либо результат, либо сообщение об ошибке.

Я также позволил себе выделить секцию пользовательского ввода в отдельную функцию. И я написал - я надеюсь - полезные комментарии, чтобы немного улучшить Python.

def get_inputs():
    """ Gets the user input for six parameters. """
    ''' Read in first equation, ax + by = c '''
    a = int(input())
    b = int(input())
    c = int(input())

    ''' Read in second equation, dx + ey = f '''
    d = int(input())
    e = int(input())
    f = int(input())

    return (a, b, c, d, e, f)

def find_solution(a, b, c, d, e, f):
    """ Find's solution for ax + by == c and dx + ey == f
    for x, y in [-10, 10).

    Returns (x, y) or None
    """
    for x in range(-10,10):
        for y in range(-10,10):
            if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
                return (x, y)
    return None  # Not necessary but explicit.


if __name__ == '__main__':  # This is good practice. More here: https://stackoverflow.com/questions/419163/
    a, b, c, d, e,f = get_inputs()
    solution = find_solution(a, b, c, d, e, f)
    if solution is not None:
        print(f"Solution found: x := {solution[0]}, y:= {solution[1]}") # These are f-strings and require Python 3.6.
        print("Solution found: x := {x}, y:= {y}".format(x = solution[0], y = solution[1])) # And this is the slightly older way of printing this.
    else:
        print("No solution could be found.")



В Python 3.8 вы можете использовать выражение присваивания и функцию any для захвата значений x и y которые удовлетворяют уравнению.

from itertools import product


if any((solution:=(x,y)) and a*x + b*y == c and d*x + e*y == f for x, y in product(range(-10, 10), repeat=2):
    print(solution)
else:
    print('No solution')

Вы можете просто обернуть текущий код в функцию и использовать return вместо break чтобы пропустить оба уровня цикла:

def calc(a, b, c, d, e, f):
    for x in range(-10,10):
        for y in range(-10,10):
            if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
                return x, y
    return "No solution"

print(calc(a, b, c, d, e, f))

Во-первых, вам нужно определить логическое значение False, чтобы определить, есть ответ или нет. Когда вы получите решение, включите его в True, чтобы вы не вызывали print («Нет решения»), даже если у вас есть ответ. Затем вы проверяете, прошли ли вы последний тест, и вызываете оператор elif, который выдает «No Solution». Вот код:

''' Read in first equation, ax + by = c '''
a = int(input())
b = int(input())
c = int(input())

''' Read in second equation, dx + ey = f '''
d = int(input())
e = int(input())
f = int(input())
#Define boolean that will know if you printed a solution or not
isSolution = False

for x in range(-10,10):
    for y in range(-10,10):
        if ((a*x) + (b*y)) == c and ((d*x) + (e*y)) == f:
            #If you find a solution
            print(x, y)
            isSolution = True
            break
        elif (y==9 and x==9 and isSolution==False):
            #If there are no solutions
            print("No solution")

Скажите, есть ли случай, когда он печатает решение, а затем печатает «Нет решения», потому что я хотел бы исправить свою ошибку. Я надеюсь, что приведенный выше код поможет!


Есть идеи?

10000