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

辗转相除法

  • 作用:
    • 可以用来求最大公约数
    • 可以求两数的最小公倍数
  • 原理:若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;
}
原文地址:https://www.cnblogs.com/qscgy/p/13341818.html