如何证明这种欧几里得(最大公约数)算法的正确性?
#include<stdio.h>
unsigned int gcd(unsigned int M, unsigned int N)
{
int rem;
if(M < N)/*exchange value to=>M>N*/
{
int temp = M;
M = N;
N = temp;
}
while(N > 0)
{
rem = M % N;
M = N;
N = rem;
}
return M;
}
int main()
{
printf("%d\n", gcd(25, 45));
return 0;
}
这种算法通过不断的求余数,直到最后结果为0,倒数第二个数就是最大公因数。这个算法很高效,但是自己怎么能证明最后非0的那个余数就一定是正确答案昵,作为数学渣有点困扰。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
手打公式太繁,改用拍照。
参见
辗转相除法。
Greatest Common Divisor。
(借张图)两个数都是由最大公约数堆出来的,所以相减、取模最大公约数肯定是不变的。(直观解释)