运用欧几里得算法和连续整数检测算法求最大公约数

下面运用两种方法求取最大公约数:

公约数定义:如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”。

(1)欧几里得算法

设两个自然数分别为m,n,(这里假设m,n分别为35和25)其基本思想是将m和n辗转相除直到余数为0.

被除数m除数n余数r
第一次相除352510
第二次相除25105
第三次相除1050
#include <iostream>
using namespace std;
void swap(int m,int n)
{
	int temp = m;
	m = n;
	n = temp;
}
int gcd(int m,int n)
{
	int cf = 0;    //设置一个计数器,初始值为0
	if(m == 0)   //如果输入的数为0,返回0
		return 0;
	if(n ==0)
		return 0;
	if(n > m)   //如果输入的n > m,调用交换函数
		swap(m,n);
	int r = m % n;  //给r赋初值 
	while(r != 0)   //直到r即余数为0时停止循环
	{
		m = n;
		n = r;
	    r = m % n;   //辗转相除
		cf++;
	}
	cout<<cf<<endl;  //输出循环次数
	return n;
}
int main()
{
	int m,n,r;
	cin>>m;
	cin>>n;
	cout<<gcd(m,n)<<endl;
    system("pause");
    return 0;
}



/*
输出结果:
35
25
2
5
请按任意键继续. . .
*/

(2)连续整数检测算法

条件与上一个一样,连续整数检测算法的基本思想是:先将min{m,n}的最小值赋给t,之后只有m%t == 0与n % t==0时while循环才结束,如果不满足条件t就会一直自减,直到找到了他们相同的约数。

#include <iostream>
using namespace std;
int gcd(int m,int n)
{
	int cf = 0;  //设置计数器
	if(m == 0)
		return 0;
	if(n == 0)
		return 0;
	int t = m > n? n:m;  //比较m,n判断t的取值
	while(m % t  || n % t )  //只有当m,n的余数都为0时结束循环
	{
		t--;
		cf++;
	}
	cout<<cf<<endl;  //输出循环次数
	return t;

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


/*
输出结果:
35
25
20
5
请按任意键继续. . .
*/

由以上计数器的次数可知欧几里得算法的时间复杂度较低,效率较高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值