三种不同的算法求两个自然数的最大公约数

一、实验目的
1.熟悉算法求解问题的过程
2.练习使用不同算法求解同一问题,并对算法进行分析
二、实验内容
1.使用三种不同的算法求两个自然数的最大公约数。
2. 对三种算法的时间复杂度进行分析。

第一种:欧几里得辗转相除法伪代码描述:
if m<n then
交换m,n的值
while true
r=m%n
if r=0 then
输出n
结束循环
else m=n
n=r

第二种:辗转相减法伪代码描述:
if m<n then
交换m,n的值
while m-1≠0
temp=m-n
m=n
n=temp
if m<n then
交换m,n
输出n

第三种:穷举法伪代码描述
if m<n then
p=m
交换m,n
else p=n
if m%n≠0 then
N=n-1
while p%n并且m%n余数≠0
n=n-1
输出n
else 输出n

  1. 运算结果
    答:
//欧几里得递归算法(辗转相除法)
void Euclid(int m,int n)
{
	int t;
	if(m<n)
	{
		t=m;
		n=m;
		m=t;
	}
	int r;
	while(true)
	{
		r=m%n;
		if(r==0)
		{
			cout<<"最大公约数:"<<n<<endl;
			break;
		}
		else
		{
			m=n;
			n=r;
		}
	}
}

//辗转相减法
 
void Subtraction(int m,int n)
{
	int t;
	if(m<n)
	{
		t=m;
		n=m;
		m=t;

	}
	int temp;
	while(m-n!=0)
	{
		temp=m-n;
		m=n;
		n=temp;
		if(m<n)
		{
			temp=n;
			n=m;
			m=temp;
		}
		
		

	}
	cout<<"最大公约数:"<<n<<endl;

}

//穷举法
 
void Exhaustive(int m,int n)
{
	int t;
	if(m<n)
	{
		t=m;
		n=m;
		m=t;

	}
		while(m%n!=0)
		{
			n--;
		}
		cout<<"最大公约数:"<<n<<endl;

}


//测试
int main()
{
	int m,n;
	cout<<"输入两个数:"<<endl;
	cin>>m;
	cin>>n;
	//Euclid(m,n);
	//Subtraction(m,n);
	Exhaustive(m,n);
	system("pause");
	return 0;
}
  1. 算法分析
    答:(1)欧几里得辗转相除法:已知斐波纳契数列增长速度是指数,那么待分析的数列也是指数增长,设欧几里得算法需要k次,那么n=O(2^k),则k=O(lg n).
    所以欧几里得算法求最大公约数的时间复杂度是对数量级的,速度非常快,为k=O(lgn)
    (2)辗转相减法:根据算法,m-n!=0,则m>n,分析while循环的执行次数可知,当n=m-n即m=2n时执行次数最大为2n,故辗转相减法的时间复杂度为O(2n)
    (3)穷举法:除数为n时,每次n减一,最坏执行n次,则可知穷举法的时间复杂度为O(n)

分析不是做的很好,可能有错误!还希望有识之士能够指正,不胜感激!

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值