这是一道经典的面试题,需要我们在不使用任何内置函数的前提下,手动实现求指定整数的算术平方根。
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
原题链接:https://www.webguidecorpuschristi.com/problems/sqrtx/
可以明确的是,此处题目要求计算结果直接将小数部分舍去,只保留整数部分,如样例中8的平方根最后返回2。我采用遍历穷举的方法求解此题,大概思路如下:
def mySqrt(num):res=0if num==0:return 0i=1while i<int(num+1):# print(i)if i*i == num: # 如果正好可以开方res = ibreakelif i*i > num: # 如果刚好大于这个数res=i-1breaki+=1return int(res)
在这里我稍微对上面的解答做了细微的扩展,具体改变如下:
# -*- coding: utf-8 -*-
# create time:2022/10/9
'''
手动实现开放运算:
1.输入一个整数
2.计算开根号
3.输出开根结果
'''
import mathdef sqrt_operator(num,epsilon):res=0if num==0:res=0i=1while i<int(num):# print(i)if math.pow(temp, 2) == num: # 如果正好可以开方res = ibreakelif math.pow(temp, 2) > num: # 如果刚好大于这个数stride = 0.0001 # 设置步长temp=i - 1while temp <i:if math.fabs(math.pow(temp, 2) -num)<epsilon:res = tempbreaktemp+=strideif temp<i:breaki+=1return resdef main():num = float(input("输入一个非负数:"))# print(mySqrt(num))# num=7epsilon=0.001 # 精度误差while num >= 0: # 循环输入,直到输入一个负整数sqrt_num = sqrt_operator(num,epsilon)print('-' * 10)print("根号{}是{}".format(str(num), str(sqrt_num)), )num = float(input("输入一个非负数:"))if __name__ == '__main__':main()
运行结果如下图所示: