FWIW, делая поиск перебором, как это очень неэффективный способ аппроксимации квадратных корней. Но я думаю, что это разумное упражнение, если вы просто учитесь делать циклы.
Основная проблема с вашим кодом заключается в том, что вы продолжаете цикл после того, как нашли решение. Вы также делаете некоторые ненужные тесты. Вот исправленная версия вашего кода.
def sqrt_approx(num):
i = 0
minsq = 0
maxsq = 0
while i <= num:
if i * i <= num:
minsq = i
if i * i >= num:
maxsq = i
break
i = i + 1
return minsq, maxsq
#Test it
for i in range(0, 26):
print(i, sqrt_approx(i))
выход
0 (0, 0)
1 (1, 1)
2 (1, 2)
3 (1, 2)
4 (2, 2)
5 (2, 3)
6 (2, 3)
7 (2, 3)
8 (2, 3)
9 (3, 3)
10 (3, 4)
11 (3, 4)
12 (3, 4)
13 (3, 4)
14 (3, 4)
15 (3, 4)
16 (4, 4)
17 (4, 5)
18 (4, 5)
19 (4, 5)
20 (4, 5)
21 (4, 5)
22 (4, 5)
23 (4, 5)
24 (4, 5)
25 (5, 5)
Вот немного более эффективная версия.
def sqrt_approx(num):
for i in range(num+1):
sq = i * i
if sq == num:
return i, i
elif sq > num:
return i-1, i
В Python 2 было бы более эффективно использовать xrange()
, а не range()
, особенно, если вы вызываете эту функцию с большими числами. Но, как я упоминал выше, есть много лучшие способы приближения целочисленных квадратных корней.
Это новая версия, которая корректно обрабатывает (неотрицательные) числа с плавающей запятой.
from math import floor
def sqrt_approx(num):
fnum = int(floor(num))
i = 0
while True:
if i * i <= fnum:
minsq = i
if i * i >= num:
maxsq = i
break
i = i + 1
assert minsq**2 <= num <= maxsq**2
return minsq, maxsq
for i in range(17):
j = i
print j, sqrt_approx(j)
j = i + 0.2
print j, sqrt_approx(j)
выход
0 (0, 0)
0.2 (0, 1)
1 (1, 1)
1.2 (1, 2)
2 (1, 2)
2.2 (1, 2)
3 (1, 2)
3.2 (1, 2)
4 (2, 2)
4.2 (2, 3)
5 (2, 3)
5.2 (2, 3)
6 (2, 3)
6.2 (2, 3)
7 (2, 3)
7.2 (2, 3)
8 (2, 3)
8.2 (2, 3)
9 (3, 3)
9.2 (3, 4)
10 (3, 4)
10.2 (3, 4)
11 (3, 4)
11.2 (3, 4)
12 (3, 4)
12.2 (3, 4)
13 (3, 4)
13.2 (3, 4)
14 (3, 4)
14.2 (3, 4)
15 (3, 4)
15.2 (3, 4)
16 (4, 4)
16.2 (4, 5)
Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что SO не является сервисом завершения домашнего задания. – TigerhawkT3
, пожалуйста, помогите мне много попробовать, чтобы получить правильный выход. Не получается .. – SoorU
Я не думаю, что задавать домашние вопросы на SO запрещено, но вы должны более подробно объяснить, что не так с кодом, который вы предоставили: например , дать некоторый пример ожидаемого ввода и вывода и сравнить с тем, что вы на самом деле получаете. – xnx