1,欧几里得算法
2,暴力求解算法:k=min{m,n}->判断k是否为最大公约数 ->不是则k递减
3,对暴力发的一个优化:主要是对于k的值更新做相应的优化,本来最开始想到的是每次都取较小值n除以相应的数(1,2,3,5、、、后边就是素数递增),但是想到每次运用此法都要求相应的素数,这样就加大了程序的运算量,于是就选择了更新值时选择除以递增的自然数
本文纯属作者无事瞎想,不足之处,还望见谅
代码如下:
#include <iostream>
using namespace std;
int main ()
{
long long Euclid(long long m,long long n,long long &count); //欧几里得算法
long long Function(long long m,long long n,long long &count); //普通算法:k=min{m,n}->判断k是否为最大公约数 ->不是则k递减
long long FunctionPlus(long long m,long long n,long long &count); //普通算法改进版
long long m,n,k,count=0;
cout<<"Please input m and n: ";
cin>>m>>n;
if(m<n) //保证 n 不大于 m
{
m=m+n;
n=m-n;
m=m-n;
}
cout<<"欧几里得算法:"<<endl; //运用欧几里得算法求出最大公约数,并输出计算次数
k = Euclid(m,n,count);
cout<<"The gcd is:"<<k<<" ";
cout<<"The number of operation is:"<<count<<endl;
count = 0; //把 count 清零
cout<<"普通算法:"<<endl; //运用普通算法求出最大公约数,并输出计算次数
k=Function(m,n,count);
cout<<"The gcd is:"<<k<<" ";
cout<<"The number of operation is:"<<count<<endl;
count = 0;
cout<<"普通算法改进版:"<<endl;
k=FunctionPlus(m,n,count);
cout<<"The gcd is:"<<k<<" ";
cout<<"The number of operation is:"<<count<<endl;
return 0;
}
long long Euclid(long long m,long long n,long long &count) //欧几里得算法
{
long long x; //中间变量
while(n!=0)
{
x=m%n;
m=n;
n=x;
count++;
}
return m;
}
long long Function(long long m,long long n,long long &count) //普通算法:k=min{m,n}->判断k是否为最大公约数 ->不是则k递减
{
long long x; //中间变量
x=n;
while(m%x!=0 || n%x!=0)
{
x--;
count++;
}
return x;
}
long long FunctionPlus(long long m,long long n,long long &count) //普通算法改进版
{
long long x; //中间变量
x=n;
while(m%x!=0 || n%x!=0)
{
x=(long long)(n/(count+2));
count++;
}
return x;
}
部分运行结果如下:
第一组测试:
Please input m and n: 60 24
欧几里得算法:
The gcd is:12 The number of operation is:2
普通算法:
The gcd is:12 The number of operation is:12
普通算法改进版:
The gcd is:12 The number of operation is:1
Process exited after 4.625 seconds with return value 0
请按任意键继续…
第二组测试:
Please input m and n: 5 3
欧几里得算法:
The gcd is:1 The number of operation is:3
普通算法:
The gcd is:1 The number of operation is:2
普通算法改进版:
The gcd is:1 The number of operation is:1
Process exited after 2.884 seconds with return value 0
请按任意键继续…
第三组测试:
Please input m and n: 78945 456
欧几里得算法:
The gcd is:57 The number of operation is:2
普通算法:
The gcd is:57 The number of operation is:399
普通算法改进版:
The gcd is:57 The number of operation is:7
Process exited after 7.063 seconds with return value 0
请按任意键继续…