辗转相除法(欧几里得算法)求最大公因数

我们在刚接触编程的时候,遇到求最大公因数的题,往往会选择从n-1开始用循环枚举的方法来找出能被它整除的最大的数,这种算法虽然操作简便易于理解,但时间复杂度是O(n)级别的遇到要求严格的题,可能会时间超限。
下面我们来介绍一种优秀的求最大公因数的方法——辗转相除法

辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

下面用代码来实现一下
循环实现

#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
    int a, b, r = 1;
    scanf("%d%d", &a, &b);
    if(a < b)               //如果a
        swap(a, b);         //则交换a,b的值
    while(r != 0){
        r = a % b;          //a除以b,将第一余数赋给r
		a = b;              //把除数赋给a
		b = r;              //把第一余数赋给b,下一次循环用除数除以第一余数,以此类推,直到出现的余数为0
    }
    printf("%d\n", a);      //此时的a为最后一次相除的除数,即a,b的最大公因数
    return 0;
}

递归实现

#include <stdio.h>
int gcd(int a, int b){
	return b == 0 ? a : gcd(b, a%b);
}
int main(){
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d\n", gcd(a,b));
	return 0;
}

求完了最大公因数,再让你求最小公倍数该怎么办呢?
我们是不是让其中一个数除以它们的最大公因数,再乘上另一个数是不是就可以了!
比如:6和9的最大公因数是3,让6除以他们的最大公因数3得2,再乘上9得18,18是不是就是6和9的最小公倍数呢!

你可能感兴趣的:(基础算法)