一、实验目的
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
- 运算结果
答:
//欧几里得递归算法(辗转相除法)
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)欧几里得辗转相除法:已知斐波纳契数列增长速度是指数,那么待分析的数列也是指数增长,设欧几里得算法需要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)
分析不是做的很好,可能有错误!还希望有识之士能够指正,不胜感激!