• 辗转相除法的证明


    描述

    给出两个整数 ab,请计算 ab 的最大公约数,通过 print 语句输出。

    1≤b≤a≤1000

    样例

    评测机将通过执行命令 python main.py {a} {b} 来执行你的代码,并将 ab 作为命令行参数传入。

    样例一

    a = 15b = 12 时,程序执行打印出的结果为:

    3

    样例二

    a = 10b = 7 时,程序执行打印出的结果为:

    1
    挑战

    你可以用时间复杂度比 O(n) 更小的方法来解决该问题吗?

    import sys
    
    a = int(sys.argv[1])
    b = int(sys.argv[2])
    # write your code here
    # please print the greatest common divisor of a and b
    
    def gcd(a, b):
        if a % b == 0:
            return b
        return gcd(b, a % b)
    
    print(gcd(a, b))
    

    如何证明辗转相除法的正确呢???

    我自己想到的一个思路,假设a,b的最大公约数是k,则有a=mk, b=nk;当然,m<n

    为了找到k,采用mk%nk=?k,?肯定是小于n的,如果能够使用迭代算法,让?=1,则两个求余结果就是k,也就是要找的最大公约数了。

    好,迭代如下:

    mk%nk=?k

    nk%?k=??k

    ?k%??k=???k

    ??%???k=....

    则?一直迭代下去肯定会为1。因为两个不断变小的整数相除求余一定会迭代终止,终止条件势必被除数是1.

  • 相关阅读:
    课堂测试-单元测试(比较大小)
    第三周进度条
    软件工程个人作业02
    构建之法——阅读笔记02
    第二周学习进度条
    第一周学习进度条
    软件工程个人作业01
    构建之法阅读笔记01
    java课堂测试
    Java验证码程序
  • 原文地址:https://www.cnblogs.com/bonelee/p/16339718.html
Copyright © 2020-2023  润新知