详细解析在代码中:(附加算法执行时间)
//递归实现
#include<iostream>
#include<math.h>
#include<windows.h>
using namespace std;
int maxgys(int x,int y,int i,int after,int a){
// 如果i小于等于两个数的最小值,就判断这两个数是否能整除i
if(i<=a){
// 如果能整除
if(x%i==0&&y%i==0){
// 最大公约数变成i
after=i;
// cout<<"after:"<<after<<endl;
}
// 继续递归判断i+1
after = maxgys(x,y,i+1,after,a);
}
// cout<<"the end num " <<after<<endl;
return after;
}
int main(){
_LARGE_INTEGER time_start; //开始时间
_LARGE_INTEGER time_over; //结束时间
double dqFreq; //计时器频率
LARGE_INTEGER f; //计时器频率
QueryPerformanceFrequency(&f);
dqFreq = (double)f.QuadPart;
//------------
// 1肯定是公约数,所以从2开始依次判断,直到找到最大的
// before代表无比1大的公约数时,就输出1
// after代表所求的比1大的公约数
int x,y,i=2,before=1,after=0;
cin>>x>>y;
// 求x,y的最小值,因为最大公约数最大也不超过两个数中最小的值
//2和6,最大公约数就是2
int a=min(x,y);
QueryPerformanceCounter(&time_start); //计时开始
int result = maxgys(x,y,i,after,a);
QueryPerformanceCounter(&time_over); //计时结束
// cout<<"result"<<result<<endl;
cout<<x<<"和"<<y<<"的最大公约数是"<<max(result,before)<<endl;
cout << "所用时间为" << 1000000 * (time_over.QuadPart - time_start.QuadPart) / dqFreq << "微秒" << endl;
}
//循环实现
#include<iostream>
#include<math.h>
#include<windows.h>
using namespace std;
int maxgys(int x,int y){
// 两个数的最小值
int a=min(x,y);
// 默认公约数before,最大公约数after
int before=1,after=0;
for(int i=2;i<=a;i++){
if(x%i==0&&y%i==0){
after=i;
}
}
// 循环结束后看看是否有最大公约数,有则返回
if(after>before){
return after;
}
// 无则返回默认公约数1
return before;
}
int main(){
_LARGE_INTEGER time_start; //开始时间
_LARGE_INTEGER time_over; //结束时间
double dqFreq; //计时器频率
LARGE_INTEGER f; //计时器频率
QueryPerformanceFrequency(&f);
dqFreq = (double)f.QuadPart;
//------------
int x,y;
cin>>x>>y;
QueryPerformanceCounter(&time_start); //计时开始
int result = maxgys(x,y);
QueryPerformanceCounter(&time_over); //计时结束
cout<<x<<"和"<<y<<"的最大公约数是"<<result<<endl;
cout << "所用时间为" << 1000000 * (time_over.QuadPart - time_start.QuadPart) / dqFreq << "微秒" << endl;
}