В этой статье приведены решения задач на принадлежность точки области, ограниченной прямыми и окружностью, а также программное представление теоремы Лагранжа и связанной с ней задачей нахождения суммы квадратов или кубов натурального числа.
Принадлежит ли точка области.
Нужно написать программу, которая выводит слово "YES", если заданная точка принадлежит закрашенным областям, включая границы, или выведет слово "NO", если не принадлежит.
Задачу нужно разбить на две части:
1. принадлежит ли точка окружности;
2. точка находится выше или ниже прямой.
Точка принадлежит окружности, если эта точка находится на расстоянии не большем, чем радиус окружности. На рисунке видно, что радиус равен
2, а центр окружности имеет координаты X: -1 и Y: 1. Радиус является гипотенузой прямоугольного треугольника и по теореме Пифагора можно вывести такое условие вхождения точки внутрь окружности:
abs(xn + 1)**2 + abs(yn - 1)**2 <= 4
Теперь нужно найти линейные функции прямых. Решив систему уравнений получаем две функции прямых:
y = -x
y = 2x + 2
Значит если x + y >= 0, то точка находится выше первой прямой или принадлежит ей, а если y - 2*x >= 2, то точка находится выше второй прямой или принадлежит ей. Зная эти условия, пишем программу:
def IsPointInArea(xn, yn):
....return (yn - 2 * xn >= 2 and xn + yn >= 0 and abs(xn + 1)**2 +
........abs(yn - 1)**2 <= 4) \
........or (yn - 2 * xn <= 2 and xn + yn <= 0 and abs(xn + 1) ** 2 +
........abs(yn - 1) ** 2 >= 4)
x1 = float(input())
y1 = float(input())
if IsPointInArea(x1, y1):
....print('YES')
else:
....print('NO')
Теорема Лагранжа.
Теорема Лагранжа о сумме четырёх квадратов гласит:
"Всякое натуральное число можно представить в виде суммы четырёх квадратов целых чисел."
Нужно сделать программу, которая по заданному числу "n", выведет от 1 до 4 натуральных чисел, квадраты которых дают в сумме данное число.
def lagrange(x, pow, q):
....b = int(x ** (1 / pow))
....if x - b ** pow == 0:
........return str(b)
....if q == 1:
........return 0
....while lagrange(x - b ** pow, pow, q - 1) == 0:
........b -= 1
........if b <= 0:
............return 0
....return str(b) + ' ' + lagrange(x - b ** pow, pow, q - 1)
n = int(input())
print(lagrange(n, 2, 4))
В функцию lagrange в качестве входных параметров подается число "n", для которого ищутся квадраты, степень 2, то есть квадрат и количество этих самых квадратов, в данном случае 4.
В цикле while рекурсивно запускается таже функция lagrange, на вход которой подаются число, из которого вычитается квадрат x - b ** pow, степень и число квадратов, уменьшенное на единицу q - 1. Напомню, что число, возведенное в степень 1/2 равно квадратному корню от этого числа.
Сумма кубов.
На основании предыдущей программы не сложно решить другую задачу.
"Напишите программу, которая по заданному числу "n", выведет от 1 до 7 натуральных чисел, кубы которых дают в сумме данное число."
def lagrange(x, pow, q):
....b = int(x ** (1 / pow))
....if x - b**pow == 0:
........return str(b**pow)
....if q == 1:
........return 0
....while lagrange(x - b ** pow, pow, q - 1) == 0:
........b -= 1
........if b <= 0:
............return 0
....return str(b**pow) + ' ' + lagrange(x - b**pow, pow, q - 1)
n = int(input())
print(lagrange(n, 3, 7))
В функцию lagrange в качестве входных параметров подается число "n", для которого ищутся кубы, степень 3, то есть куб и количество этих самых кубов, в данном случае 7.
Минимальный делитель числа.
Как найти минимальный делитель числа? Если число "n" не имеет делителя, которое не превосходит корня из этого "n", то значит, что число "n" простое, тогда ответом является само число n. У составных чисел всегда есть делители, не равные 1 и не больше корня из "n".
import math
def MinDivisor(n):
....if n <= 1:
........return n
....i = 2
....while i <= math.sqrt(n):
........if n % i == 0:
............ return i
........i += 1
....return n
n = int(input())
print(MinDivisor(n))
Заключение
На моём канале можно найти другие типовые задачи и их решения. Эти задачи могут встретиться как на Олимпиаде так и на собеседовании. Желаю всем верных и красивых решений любых задач!