Поиск квадратных уравнений, имеющих решение

Программа принимает от пользователя диапазоны для коэффициентов a, b, c квадратного уравнения:

ax2 + bx + c = 0

Перебирает все варианты целочисленных коэффициентов в указанных диапазонах, определяет квадратные уравнения, которые имеют решение.

import math
 
a1 = int(input('a1: '))
a2 = int(input('a2: '))
b1 = int(input('b1: '))
b2 = int(input('b2: '))
c1 = int(input('c1: '))
c2 = int(input('c2: '))
 
a = range(a1, a2 + 1)
b = range(b1, b2 + 1)
c = range(c1, c2 + 1)
 
for i in a:
    if i == 0:
        continue
    for j in b:
        for k in c:
            print(i, j, k, end=' ')
            D = j * j - 4 * i * k
            if D >= 0:
                x1 = (-j - math.sqrt(D)) / (2 * i)
                x2 = (-j + math.sqrt(D)) / (2 * i)
                print('Yes', round(x1, 2), round(x2, 2))
            else:
                print('No')

С комментариями:

# импортируем модуль, содержащий функцию для
# извлечения квадратного корня
import math
 
# вводятся нижние и верхние границы для
# коэффициентов a, b, c
a1 = int(input('a1: '))
a2 = int(input('a2: '))
b1 = int(input('b1: '))
b2 = int(input('b2: '))
c1 = int(input('c1: '))
c2 = int(input('c2: '))
 
# создаются объекты-диапазоны
# +1 позволяет включить в диапазон верхнюю границу
a = range(a1, a2 + 1)
b = range(b1, b2 + 1)
c = range(c1, c2 + 1)
 
# перебираются все возможные сочетания коэффициентов
# i - текущий элемент из диапазона a
# j - текущий элемент из диапазона b
# k - текущий элемент из диапазона c
for i in a:
    if i == 0:
        # если i равен 0, то уравнение не квадратное, а линейное
        # поэтому решать уравнение не надо,
        # вместо этого выполняется переход к следующей итерации цикла
        continue
    for j in b:
        for k in c:
            # выводятся текущие значения коэффициентов a, b, c
            print(i, j, k, end=' ')
            # вычисляется дискриминант
            D = j * j - 4 * i * k
            if D >= 0:
                # если дискриминант больше нуля или равен ему,
                # то вычисляются корни квадратного уравнения
                x1 = (-j - math.sqrt(D)) / (2 * i)
                x2 = (-j + math.sqrt(D)) / (2 * i)
                # выводятся корни, округленные до двух знаков после точки
                print('Yes', round(x1, 2), round(x2, 2))
            else:
                # если дискриминант меньше нуля, то корней нет
                print('No')

Пример выполнения:

a1: -2
a2: 2
b1: -3
b2: 1
c1: 0
c2: 4
-2 -3 0 Yes -0.0 -1.5
-2 -3 1 Yes 0.28 -1.78
-2 -3 2 Yes 0.5 -2.0
-2 -3 3 Yes 0.69 -2.19
-2 -3 4 Yes 0.85 -2.35
-2 -2 0 Yes -0.0 -1.0
-2 -2 1 Yes 0.37 -1.37
-2 -2 2 Yes 0.62 -1.62
-2 -2 3 Yes 0.82 -1.82
-2 -2 4 Yes 1.0 -2.0
-2 -1 0 Yes -0.0 -0.5
-2 -1 1 Yes 0.5 -1.0
-2 -1 2 Yes 0.78 -1.28
-2 -1 3 Yes 1.0 -1.5
-2 -1 4 Yes 1.19 -1.69
-2 0 0 Yes -0.0 -0.0
-2 0 1 Yes 0.71 -0.71
-2 0 2 Yes 1.0 -1.0
-2 0 3 Yes 1.22 -1.22
-2 0 4 Yes 1.41 -1.41
-2 1 0 Yes 0.5 -0.0
-2 1 1 Yes 1.0 -0.5
-2 1 2 Yes 1.28 -0.78
-2 1 3 Yes 1.5 -1.0
-2 1 4 Yes 1.69 -1.19
-1 -3 0 Yes -0.0 -3.0
-1 -3 1 Yes 0.3 -3.3
-1 -3 2 Yes 0.56 -3.56
-1 -3 3 Yes 0.79 -3.79
-1 -3 4 Yes 1.0 -4.0
-1 -2 0 Yes -0.0 -2.0
-1 -2 1 Yes 0.41 -2.41
-1 -2 2 Yes 0.73 -2.73
-1 -2 3 Yes 1.0 -3.0
-1 -2 4 Yes 1.24 -3.24
-1 -1 0 Yes -0.0 -1.0
-1 -1 1 Yes 0.62 -1.62
-1 -1 2 Yes 1.0 -2.0
-1 -1 3 Yes 1.3 -2.3
-1 -1 4 Yes 1.56 -2.56
-1 0 0 Yes -0.0 -0.0
-1 0 1 Yes 1.0 -1.0
-1 0 2 Yes 1.41 -1.41
-1 0 3 Yes 1.73 -1.73
-1 0 4 Yes 2.0 -2.0
-1 1 0 Yes 1.0 -0.0
-1 1 1 Yes 1.62 -0.62
-1 1 2 Yes 2.0 -1.0
-1 1 3 Yes 2.3 -1.3
-1 1 4 Yes 2.56 -1.56
1 -3 0 Yes 0.0 3.0
1 -3 1 Yes 0.38 2.62
1 -3 2 Yes 1.0 2.0
1 -3 3 No
1 -3 4 No
1 -2 0 Yes 0.0 2.0
1 -2 1 Yes 1.0 1.0
1 -2 2 No
1 -2 3 No
1 -2 4 No
1 -1 0 Yes 0.0 1.0
1 -1 1 No
1 -1 2 No
1 -1 3 No
1 -1 4 No
1 0 0 Yes 0.0 0.0
1 0 1 No
1 0 2 No
1 0 3 No
1 0 4 No
1 1 0 Yes -1.0 0.0
1 1 1 No
1 1 2 No
1 1 3 No
1 1 4 No
2 -3 0 Yes 0.0 1.5
2 -3 1 Yes 0.5 1.0
2 -3 2 No
2 -3 3 No
2 -3 4 No
2 -2 0 Yes 0.0 1.0
2 -2 1 No
2 -2 2 No
2 -2 3 No
2 -2 4 No
2 -1 0 Yes 0.0 0.5
2 -1 1 No
2 -1 2 No
2 -1 3 No
2 -1 4 No
2 0 0 Yes 0.0 0.0
2 0 1 No
2 0 2 No
2 0 3 No
2 0 4 No
2 1 0 Yes -0.5 0.0
2 1 1 No
2 1 2 No
2 1 3 No
2 1 4 No