透徹理解輾轉相除法

冰冰糖yyy發表於2021-03-04

一、理解

今天終於對輾轉相除法有了一個透徹的理解!!!

接觸過一些演算法的應該都知道輾轉相除法是求最大公約數的一個方法。

那麼為什麼這種方法可以求出來呢?

我們先來假設a,b的最小公約數為g,那麼我們可以這樣表示a=m*g,b=n*g;(m,n為整數)(*)

a=b*k+r;(k,r為整數)(**)

現在我們用(*)中的a,b替換(**),得到m*g=n*g*k+r;

上述式子變形得到r=g*(m-n*k);

此時可以看出a,b的最大公約數也是b,r的最大公約數。

然後不斷縮小規模,直到其中一個數為0;即r得值為0;(還有一丟丟迷惑中。。。)

二、應用(最大公約數和最小公倍數)

#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;
//輾轉相處法 求最大公約數 
int GCD(int a,int b){
	if(b == 0){
		return a;
	}else{
		return GCD(b,a%b);
	}
}
int main(){
    int a,b;
	while(scanf("%d%d",&a,&b)!=EOF) {
		printf("%d\n",GCD(a,b));
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;
//求最小公倍數 
int GCD(int a,int b){
	if(b == 0){
		return a;
	}else{
		return GCD(b,a%b);
	}
}
int main(){
    int a,b;
	while(scanf("%d%d",&a,&b)!=EOF) {
		printf("%d\n",a*b/GCD(a,b));
	}
	return 0;
}

 

相關文章