#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 и y5. Это не близко. Это идентично
Ответ №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. Спасибо за вашу помощь. Я буду учитывать ваши отзывы в будущем.