欧几里德求最大公约数(辗转相除法)
Def:
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数为0。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
eg:1997和615的最大公约数?
1997 / 615 = 3······152
615 / 152 = 4······7
152 / 7 = 21·····5
7 / 5 = 1······2
2 / 1 = 2······0 //最大公约数为1
代码:
#include <iostream> using namespace std; int main() { int a, b, m, n, r; cout << "输入两个不相等的整数:" ; cin >> a >> b; //保证m作为较大数,n为较小数 if(a > b) { m = a; n = b; } else { m = b; n = a; } //辗转相除法 do { r = m % n; //r为余数 m = n; //更新被除数上一除数 n = r; //更新除数为上一余数 }while(r != 0); cout << "输入的两个数的最大公约数是:" << m <<endl; }
-
关于三个数的最大公约数
GCD (a, b, c) = GCD (a, GCD (b, c)) = GCD (GCD (a, b), c) = GCD (GCD (a, c), b)
即。先求两个数的GCD再求和另一个数的GCD。(n个数的最大公约数同理)

浙公网安备 33010602011771号