计算两个整数的平方之间的值

时间:2015-08-09 06:03:56

标签: python

创建一个函数,该函数接收正数并返回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) 

3 个答案:

答案 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))