欧几里得算法求两个整数的最大公约数介绍(C++实现)

欧几里得算法求两个整数的最大公约数介绍(C++实现)

欧几里得算法(Euclidean algorithm)求两个整数的最大公约数(Greatest Common Divisor,GCD)。欧几里得算法,也称辗转相除法。

欧几里得算法的基本思想是利用两个数的除余性质:如果两个数a和b有公约数c,那么a/b的余数必然是c/b的余数。因此,我们可以不断用较小的数去除较大的数,直到余数为0,此时除数即为两个输入数的最大公约数。

算法过程如下:

确定两个数,设大的数为 A,小的数为 B。

将 A 除以 B,得到余数 r。将 B 和 r 作为新一轮的 A 和 B。

重复步骤 2,直到余数 r 为 0。此时的 B 就是 A 和 B 的最大公约数。

例如,要计算 28 和 16 的最大公约数,可以进行以下步骤:

28 ÷ 16  =  1 …… 12 (商是1,余数是12)

16 ÷ 12  =  1 …… 4 (商是1,余数是4)

12 ÷ 4  =  3 …… 0 (商是3,余数是0,结束)

要计算 28 和 16 的最大公约数4

下面给出用欧几里得算法求两个整数的最大公约数C++实现的几种写法。

法一、源码如下:

#include <iostream>
using namespace std;

int main(){
	int m, n, gcd;
	cin>>m>>n;
	gcd = m > n ? n : m; // 初始化gcd为m和n中较小的数	
	while (gcd > 1 && (m % gcd != 0 || n % gcd != 0)) //当gcd大于1且m和n都无法整除gcd时执行循环
	    gcd--;
	cout << gcd <<endl;
	
	return 0;    
}

这种写法用到了三元运算符和逻辑运算符实现,比较简洁,但是可能会导致代码可读性降低。

这段代码的逻辑是:

读入两个整数m和n。

初始化最大公约数gcd为m和n中的较大值。

如果gcd大于1且m或n不能被gcd整除,就将gcd减1,重复这个过程,直到gcd等于1或者m和n都能被gcd整除。

输出最终的gcd,即为m和n的最大公约数。

法二、源码如下:

#include<iostream>
using namespace std;

int main(){
	int m , n;
	cin >> m >> n;
	int r = m % n;
	while( r != 0 ){
		m = n;
		n = r;
		r = m % n;
	}
	cout << n << endl;
	
	return 0;
}

这种是常用写法

这段代码的逻辑是:

读入两个整数m和n。

计算m除以n的余数r。

如果r不等于0,就将n赋值给m,将r赋值给n,然后再次计算m除以n的余数r,重复这个过程,直到r等于0。

输出最终的n,即为m和n的最大公约数。

法三、源码如下:

#include<iostream>
using namespace std;

int gcd(int a, int b) {  
    if (b == 0) {  
        return a;  
    } else {  
        return gcd(b, a % b);  
    }  
}

int main(){
	int m , n;
	cin >> m >> n;	
	cout << gcd(m , n) << endl;
	
	return 0;
}

这种是递归写法

代码逻辑如下:

定义了一个名为gcd的函数,该函数接受两个整数参数a和b,并返回它们的最大公约数。

在gcd函数中,首先检查b是否为0。如果是,则返回a作为最大公约数。否则,递归调用gcd函数,将b作为第一个参数,a % b作为第二个参数。

在main函数中,首先从用户输入中读取两个整数m和n。然后调用gcd函数,将m和n作为参数传递给它。最后,将计算得到的最大公约数输出到屏幕上。

猜你喜欢

转载自blog.csdn.net/cnds123/article/details/132617933