求平方根,向下取整 其实方法mysqrta已经可以求出平方根了,min为1,max为x 不过由于我小时候我爸教过我怎么笔算平方根,所以这里写一下,大概是根据a^2=b^2+2bc+c^2计算。 因为没有办法直接得出x = a^2,所以,先算b。 比如说 1234 先得出 300^2 < 123456 < 400^2,所以用1234-300^2,再计算十位数,最后计算个位数。 mysqrta计算的是结果高位第一个的值,循环次数是由1-3二分,或者4-9二分查找。 mysqrtb计算的是c的值,是在x-b^2 > 2b^c+c^2 成立的基础上的c最大值 算法复杂度为log以100为底,x为真数,再乘以log以2为底10为真数,即 log(100,x)log(2,10)=log(2,x)/2 算法复杂度减半了

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param x int整型 
# @return int整型
#
class Solution:

        # write code here
        @staticmethod
        def mysqrta(min,max,x):
            middle = int((max + min)/2)
            while (max > min):
                if middle*middle < x:
                    min = middle + 1
                elif middle*middle > x:
                    max = middle - 1
                else:
                    break
                middle = int((max + min) / 2)
            if(middle * middle > x):
                return (middle-1)
            else:
                return middle
        @staticmethod
        def mysqrtb(min,max,num,result):
            middle = int((max + min)/2)
            while (max > min):
                if num > (result * 10 * 2 + middle)*middle:
                    min = middle + 1
                elif num < (result * 10 * 2 + middle)*middle:
                    max = middle - 1
                else:
                    break
                middle = int((max + min) / 2)
            if (result * 10 * 2 + middle)*middle > num:
                return (middle-1)
            else:
                return middle
            
        def mysqrt(self , x: int) -> int:
            char_x = str(x)
            start_i = 0
            result = 0
            p_result = 0
            if(len(char_x)%2==0):
                num = int(char_x[0])*10+int(char_x[1])
                start_i += 2
                result = self.mysqrta(4,9,num)
            else:
                num = int(char_x[0])
                start_i += 1
                result = self.mysqrta(1,3,num)

            p_result = result * result

            for i in range(start_i,len(char_x),2):
                num = (num - p_result)*100+int(char_x[i])*10+int(char_x[i+1])
                max = int(num/(result*20))
                min = int(num/(result*20+10))
                if max <= (min+1):
                    d = min
                else:
                    d = self.mysqrtb(min,max,num,result)
                p_result = (result * 10 * 2 + d)*d
                result = result * 10 + d
            return result