Возникли проблемы с созданием кода, который решает для решений, когда x ^ 2 y ^ 2 = n, где n — входные данные

#python

#python

Вопрос:

Возможно ли создать программу, которая может находить решения без использования функций? Я не настолько знаком с этим. Ниже приведена моя попытка в Python 3.9:

 n = int(input("enter a number: "))

while n>0:
    for x in range(0,n):
        x **= 2
        print("this is x:", x)
        for y in range(0,n):
            y **= 2
            n = x y
            print("this is y:", y)

            if n == x y:
                print(x,y)
            else:
                print(n, "has no solution")
 

Предполагаемый результат — найти x и y, когда n может быть любым положительным целым числом. Например, x ^ 2 y ^ 2 = 9. Решениями будут (3,0) и (0,3). Спасибо всем, кто помог.

Комментарии:

1. Это уравнение для круга. Существует бесконечное количество решений. Если вы хотите нарисовать круг, вам нужно сначала решить уравнение, а затем вычислить все, что вы хотите вычислить, например y

2. n — число, программа находит как минимум два решения, поэтому при подключении к уравнению оно равно n . Не уверен, как он может иметь бесконечные решения.

3. вы имеете в виду целочисленные решения? в противном случае существует бесконечное количество решений для любого n.

4. Повторяю, это уравнение для круга. Существуют бесконечные решения, потому что на окружности есть бесконечные точки. 3,0 и 0,3 являются координатами, в которых окружность пересекает оси x и y

5. Это не близко. Это идентично

Ответ №1:

Если я правильно понимаю задачу, вы хотите решить x ^ 2 y ^ 2 = n в целых числах. Вот мой код.

 n = int(input("enter a number: "))
sqrt = {} # key: square of integer, value: square root of it
# assume that x >= y, otherwise, swap
x = 0
while x * x <= n:
    x_square = x * x
    # check if solution exists
    if n - x_square in sqrt:
        print(f'x={x} and y={sqrt[n-x_square]} satisfy x^2 y^2={n}')
        print(f'x={sqrt[n-x_square]} and y={x} satisfy x^2 y^2={n}')
    sqrt[x_square] = x
    x  = 1
 

UPD:
Ваш код также будет работать, за исключением того, что вы x y слишком рано берете квадраты и . Даже если x в цикле 3, вы преобразуете его в 9 в следующей строке. Ваш код можно исправить следующим образом.

 n = int(input("enter a number: "))
if n < 0:
    print('No solution')
else:
    solution_found = False
    for x in range(0,n):
        for y in range(0,n):
            if n == x*x   y*y:
                print(x,y)
                solution_found = True
    if not solution_found:
        print('No solution')
 

UPD2: Исправлено мое решение, не удовлетворяющее требованиям к функциям.

Комментарии:

1. Спасибо за ваш отзыв, я действительно ценю его. Я внедрю это в свой код.

2. Не могли бы вы сказать мне, что, если нет, solution_found делает?

3. Иногда решений в целых числах нет. Например, x ^ 2 y ^ 2 = 3 не имеет решений в целых числах. В этом случае я думаю, что вывод «Нет решения» был бы хорошей идеей. Поэтому мне нужно отслеживать, найдено ли решение для любой комбинации x и y, а если нет, не выводить решение

4. Для достижения этой цели я говорю это в начале solution_found = False (решение еще не найдено) и изменяю его значение на True, как только решение найдено. Если цикл не находит никакого решения, то solution_found все равно False , поэтому not solution_found не False , т. Е. Это true .

5. Для последних двух строк вашего кода, если solution_found true , почему вы не печатаете решение?

Ответ №2:

Вы можете легко «перебрать» это с помощью вложенного цикла по x и y, где y>= x, чтобы найти инверсии, не просматривая их все.

 n = 9
for x in range(n):
    for y in range(x,n 1):
        if x*x   y*y == n:
            print(*{(x,y),(y,x)}) # only print one solution if x==y

(0, 3) (3, 0)
 

Если вы хотите оптимизировать это, вы можете прервать циклы, когда оставшиеся значения превышают целевое число:

 n = 9
for x in range(n):
    if x*x > n:                    # if x^2 already greater than n
        break                      # no higher value of x will work either
    for y in range(x,n 1):
        if x*x   y*y == n:
            print(*{(x,y),(y,x)})
        elif x*x   y*y > n:        # if y already gives a result > n for this x
            break                  # then no higher value of y will work   
 

Более продвинутый метод заключается в создании словаря квадратов до n и поиске любого значения x, для которого существует квадрат, равный n-x ^ 2:

 n      = 9
y2     = {y*y:y for y in range(n 1)}
result = [(x,y2[n-x*x]) for x in range(n 1) if n-x*x in y2]

print(*result or {"no solution"}) # (0, 3) (3, 0)
                         
 

Комментарии:

1. Спасибо за вашу помощь. Я буду учитывать ваши отзывы в будущем.