最大公因数
最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个
a,b的最大公约数记为(a,b)
最大公因数算法
一、暴力循环遍历
非常耗时间,时间复杂度是O(min(a, b)),简写为O(n)
从1到a,b的最小值循环,如果a,b均模这个数为0, 那么就更改
代码如下:
#include<iostream>
using namespace std;
int a, b;
int main(){
scanf("%d%d", &a, &b);
int gcd = 1;
for(int i = 2; i <= min(a, b); i++){
if(!(a % i) && !(b % i)){
gcd = i;
}
}
printf("%d", gcd);
}
但是有没有时间复杂度更优的算法呢?
二、辗转相除法
辗转相除法,也称欧几里得算法,是求解两个数最大公约数的常用方法
辗转相除法的基本思路就是通过反复的用较大数除以最小数,然后用余数替换大数,直到余数为0
gcd函数如下:
int gcd(int a, int b){
if(b) return gcd(b, a%b);
return a;
}
但是,在引用该函数前要保证a > b
所以在主函数里swap一下就行了
完整代码如下:
//辗转相除法求最大公约数
#include<iostream>
using namespace std;
int n, m;
int gcd(int a, int b){
if(b) return gcd(b, a%b);
return a;
}
int main(){
scanf("%d%d", &n, &m);
if(n < m) swap(n, m);
printf("%d", gcd(n, m));
}
三、例题(变式)
题目描述
输入三个正整数 x,y,z,求它们的最大公约数(Greatest Common Divisor)最大的正整数g(g≥1),满足 x,y,z 都是g 的倍数,即(x mod g)=(y mod g)=(z mod g)=0。
输入格式
输入一行三个正整数x,y,z。
输出格式
输出一行一个整数g,表示x,y,z 的最大公约数
既然两个数的最大公约数我们知道了,那么我们只需求出x,y的最大公约数g1,y,z的最大公约数g2,在求出g1与g2的最大公约数就能得出g
AC代码如下:
#include<iostream>
using namespace std;
int n, m, k;
int gcd(int a, int b){
if(b) return gcd(b, a%b);
return a;
}
int main(){
scanf("%d%d%d", &n, &m, &k);
printf("%d", gcd(gcd(n, m), gcd(m, k)));
}