展轉相除法(求最大公約數或最小公倍數)

展轉相除法

  • 做用:
    • 能夠用來求最大公約數
    • 能夠求兩數的最小公倍數
  • 原理:若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;
}
相關文章
相關標籤/搜索