下面运用两种方法求取最大公约数:
公约数定义:如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”。
(1)欧几里得算法
设两个自然数分别为m,n,(这里假设m,n分别为35和25)其基本思想是将m和n辗转相除直到余数为0.
被除数m | 除数n | 余数r | |
第一次相除 | 35 | 25 | 10 |
第二次相除 | 25 | 10 | 5 |
第三次相除 | 10 | 5 | 0 |
#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
请按任意键继续. . .
*/
由以上计数器的次数可知欧几里得算法的时间复杂度较低,效率较高。