Решить задачу на python через дискриминант

Даны переменные a, b, user_input. Пользователь вводит например число 1950. Мы должны вывести сообщение после всех вычислении вместо a и b числа. Пример:

Input:

(10 * a + b) * a * b = 1950

Output:

(10 * 6 + 5) * 6 * 5 = 1950

Я не понимаю как мне найти числа a и b и как мы получили 6 и 5. Вроде как мы можем использовать дискриминант для решения этой задачи.


Ответы (2 шт):

Автор решения: u111
def solve(res):
    abs_ = res if res >= 0 else -res
    sqrt_ = int(abs_ ** 0.5) + 1
    # Перебираем возможные варианты чисел a и b
    for a in range(-sqrt_, sqrt_):
        if a == 0 or res % a:
            continue

        for b in range(-sqrt_, sqrt_):
            num = (10 * a + b) * a * b
            if num == res:
                return (a, b)
    # Если целых решений нет, ищем дробные
    if res > 0:
        a_b = (res / 11) ** (1 / 3)
    elif res < 0:
        a_b = -(-res / 11) ** (1 / 3)
    else:
        a_b = 0
    return (a_b, a_b)

res = int(input())

a, b = solve(res)

print(f"(10 * {a} + {b}) * {a} * {b} = {res}")
→ Ссылка
Автор решения: Павел
# !!!недостаточно условий в вашей задаче!!! #
#############################################

# импорт функции поиска квадратного корня
from math import sqrt

# в этой функции приводим ответ в удобоваримый вид для печати
# и ставим допуск по количеству знаков после запятой
def trans_val(value):
    str_a = str(value).split('.')[1] if '.' in str(value) else ''
    if len(str_a) <= 1:  # проверяем если после запятой 1 знак
        if str_a == '0': # если 0, то отбрасываем знаки после запятой
            value = int(value)
            if value < 0: value = str(f'({value})') # если отрицательно - заключаем в скобки
            return value
    elif 1 <= len(str_a) <= 2: # проверяем 1 знак значением не 0 и ставим ограничение длины 2 знакa 
            if value < 0: value = str(f'({value})')  # если отрицательно - заключаем в скобки
            return value
    else:
        return False
        
# ВОТ ТУТ ВАШ INPUT
user_input = int(input("Введите целое число: "))
start = user_input
stop = user_input + 1
if user_input == 0: # если ввести 0, будет перебор значений от 1 до 2000
    start = 1
    stop = 2001
for user_input in range(start, stop):
    for b in range (1, 2001):  # перебираем нужный диапазон чисел (от 1 до 2000)
        # приводим уравнение к виду Ax²+Bx+C=0, где x=а
        A = 10 * b
        B = b**2
        C = -user_input
        D = B**2 - 4*A*C  # находим дискрименант
        if b<0: b = str(f'({b})')  # если b отрицательно - заключаем в скобки
        if D >= 0 and A != 0:  # проверяем, как в школе
            # находим первый корень
            a = (-B + sqrt(D))/(2*A)  
            a = trans_val(a)
            if a: print(f'(10 * {a} + {b}) * {a} * {b} = {user_input}')
            # находим второй корень
            a = (-B - sqrt(D)) / (2*A)
            a = trans_val(a)
            if a: print(f'(10 * {a} + {b}) * {a} * {b} = {user_input}')
→ Ссылка