题解 | #最大公约数#

最大公约数

http://www.nowcoder.com/practice/cf4091ca75ca47958182dae85369c82c

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 求出a、b的最大公约数。
# @param a int 
# @param b int 
# @return int
#
class Solution:
    def gcd(self , a , b ):
        # write code here
        i = 1
        result = 1
        while i <= int(a**0.5):
            i += 1
            if(a % i == 0):
                a //= i
                if(b%i == 0):
                    result *= i
                    b //= i
                i -= 1
        if (b % a) == 0:
            result *= a
        return result
全部评论
也可以用减法,减法的算法和除法思路是一样的,将 % 改成 - 就可以了,也可以两者结合,思路都是一样的,因为我觉得 % 和 - 都算是基本运算,% 还可以避免 max 远大于 min 的情况,循环次数要少,所以用的是取余
点赞 回复 分享
发布于 2021-10-26 17:55
文里面并不是复杂度为log(n)的算法,我后面又再想了一下,想到了新的算法,这里记录一下 #最大公约数有log(n)的算法 #假设a,b的最大公约数为c,那么a = c * d; b= c * e,若a > b,则a = b * f + g; c * d = c * e * f + g,那么g的约数也一定能有c #将max表示a,b中较大的数,min表示a,b中较小的数,c = max % min,max = min, min = c,一直循环,直到c == 0,则min为最大公约数 #其中c < min max = min * g + c,g为1时c最大,此时,max = min + c > c + c max > 2*c 所以复杂度最多为2*log(n)
点赞 回复 分享
发布于 2021-10-26 17:46
class Solution: def gcd(self , a , b ): # write code here max = a min = b if (a < b): max = b min = a c = max % min while (c != 0): max = min min = c c = max % min return min
点赞 回复 分享
发布于 2021-10-26 17:44

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务