展转相除法(求最大公约数或最小公倍数)

展转相除法

  • 做用:
    • 能够用来求最大公约数
    • 能够求两数的最小公倍数
  • 原理:若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;
}
相关文章
相关标签/搜索