辗转相除法
- 作用:
- 可以用来求最大公约数
- 可以求两数的最小公倍数
- 原理:若a除以b的余数为r,则有(a,b)=(b,r),递归后,b就是他的最大公约数。
- 算法演示:
方法一:
int gcd(int m,int n)
{
int t = 1;
while(t != 0)
{
t=m%n;
m=n;
n=t;
}
return m;
}
方法二:
int gcd(int m,int n)
{
int t = 1;
while(m%n != 0)
{
t=m%n;
m=n;
n=t;
}
return n;
}
//这个时候返回的是n,为什么呢?
//因为while的原因,当m%n等于0时,直接跳出循环了,没有m,n的转换了,这点困扰我好久。。。
方法三:递归
#include <iostream>
#include <conio.h>
using namespace std;
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
cout << gcd(169, 48) << endl;
_getch();
return 0;
}