标签:nk gcd 迭代 辗转 样例 证明 sys print 除法
描述给出两个整数 a
和 b
,请计算 a
和 b
的最大公约数,通过 print
语句输出。
1≤b≤a≤1000
样例评测机将通过执行命令 python main.py {a} {b}
来执行你的代码,并将 a
和 b
作为命令行参数传入。
样例一
当 a = 15
, b = 12
时,程序执行打印出的结果为:
3
样例二
当 a = 10
, b = 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.
标签:nk,gcd,迭代,辗转,样例,证明,sys,print,除法 来源: https://www.cnblogs.com/bonelee/p/16339718.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。