辗转相除法的证明

描述

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

 

1≤b≤a≤1000

样例

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

样例一

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

3

样例二

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

1
挑战

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

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
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.

 

posted @   bonelee  阅读(183)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-06-03 AES中的ECB、CTR、MAC、GMAC、GCM
2020-06-03 数字签名算法-RSA、DSA、ECDSA、ECDH
2020-06-03 常用的数字签名算法包括:MD5withRSA/SHA1withRSA/SHA256withRSA/SHA1withDSA/SHA256withDSA/SHA512withDSA/ECDSA等
2018-06-03 leetcode 643. Maximum Average Subarray I
2018-06-03 leetcode 38. Count and Say
2018-06-03 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。
2017-06-03 python nltk 入门demo
点击右上角即可分享
微信分享提示