创建一个函数,该函数接收正数并返回2个整数,使得该数字位于2个整数的平方之间。如果数字是整数的平方,则返回相同的整数两次。
def sqApprox(num):
i = 0
minsq = 0 # set lower bound
maxsq = 0 # set upper bound
while i <= num: # set 'while' termination condition
if i * i <= num and i >= minsq: # complete inequality condition
minsq = i
if i * i > num and i >= maxsq: # complete inequality condition
maxsq = i
i = i + 1 # update i so that 'while' will terminate
return (minsq, maxsq)
答案 0 :(得分:1)
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)
答案 1 :(得分:0)
你可以使用dychotomy来更快地找到整数平方根,因为sqrt是一个单调函数:
def sqrt_approx(n):
if n<=1:
return n,n
inf =1
sup = n
while sup > inf + 1:
guess = (inf + sup)/2
g2 = guess * guess
if g2 == n:
return guess, guess
elif g2 < n:
inf = guess
else:
sup = guess
return inf, sup
只需要O(log2(n))就可以找到近似值(只需16步即可找到sqrt_approx(65535)
)
答案 2 :(得分:-1)
import math
def func(x):
return math.floor(math.sqrt(x)), math.ceil(math.sqrt(x))