浅谈辗转相除求最大公约数

辗转相除法

先上代码吧


int gcd (int a,int b){
	if(b == 0)  return a;
	else return gcd(b,a%b);
}

我们假设有两个数\(a\),\(b\) (\(a\) > \(b\)) , 设其最大公约数为 \(t\), 那么可表达为 \(a = m \times t\) , \(b = n \times t\).

其中一步为\(a\) % \(b\) , 我们设\(c\) = \(a\) % \(b\) = \(m \times t\) - \(k \times n \times t\) 也为 \(t\) 的倍数.

那么下一部操作 \(gcd\) (\(b\) ,\(c\))使两个位置的数都不断向 \(t\) 逼近 (\(c\) 是模 \(b\) 后的数,比 \(b\) 小,下一次递归时\(c\) 就到了 \(b\) 的位置).

所以最后\(b = 0\),也就是上一步的 \(a\) % \(b\) = 0,也就是这一步的 \(a\) ,上一步的 \(b\) 是最大公约数.

例子 \(gcd\) (\(84\) , \(60\)) , \(gcd\) (\(60\) , \(24\)) , \(gcd\) (\(24\) , \(12\)) , \(gcd\) (\(12\) , \(0\)).

在一开始时不用去管 \(a\)\(b\) 谁大谁小 , 会自动交换的.例子 \(gcd\) (\(5\) , \(7\)),下一步就是 \(gcd\) (\(7\) , \(5\)).

posted @ 2021-10-03 17:04  xqy2003  阅读(63)  评论(0)    收藏  举报