本文讲解最大公约数求解的几种方法,实现了使用一行代码求解最大公约数,使用了C++语言进行了实现
更相减损术
更相减损术出自《九章算术》,用来求解两个数的最大公约数
其操作步骤如下:
- 给定两个正整数,先判断这两个数是否都是偶数,若都为偶数,这两个数同时除以
2
,直到不满足两个数都为偶数这一条件(记除以2
的次数为n
),然后进行第2步 - 若两个数不都为偶数,用较大的数去减较小的数,重复这一过程,直到减数(较小的那个数)和差相等(计为
d
)为止
- 则最大公约数为除了多少次
2
的乘积再乘以相等的数,即: 2 n × d 2^n\times d 2n×d
更相减损术的C++实现
代码实现如下:
#include <iostream>
using namespace std;
int divisor(int a,int b){
int ans=1;
while(a%2==0&&b%2==0){
a=a/2;
b=b/2;
ans*=2;
}
while(a!=b){
if(a>b){
a=a-b;
}else{
b=b-a;
}
}
return ans*a;
}
int main(){
int a,b;
a=4,b=6;
cout<<divisor(a,b);
return 0;
}
运行结果为:
2
辗转相除法
- 以除数和余数反复做除法运算,当余数为
0
时,当前的除数为所要求的最大公约数
辗转相除法的C++实现
#include <iostream>
using namespace std;
int divisor(int a,int b){
if(b==0){
return a;
}else{
divisor(b,a%b);
}
}
int main(){
int a,b;
a=4,b=6;
cout<<divisor(a,b);
return 0;
}
运行结果为:
2
一行代码实现求解最大公约数
将辗转相除法进行优化,将上面代码中的divisor
函数优化为:
int divisor(int a,int b){return b?divisor(b,a%b):a;}
完整的一行代码求解最大公约数的代码为:
#include <iostream>
using namespace std;
int divisor(int a,int b){return b?divisor(b,a%b):a;}
int main(){
int a,b;
a=4,b=6;
cout<<divisor(a,b);
return 0;
}
运行结果为:
2
才疏学浅,难免有错误和不当之处,欢迎交流批评指正!
同时有问题的话欢迎留言或邮箱联系(ljt_IT@163.com)。