辗转相除法
辗转相除法,又名欧几里德算法(Euclid's Algorithm),用于计算两个数a,b的最大公约数(Greatest Common Divisor)。(a,b∈N+)
gcd(a,b)=gcd(b,a mod b)
实现原理:
当a / b = k ...... n时,
若b与n可以被同一个数整除,则a自然也可以被该数整除。
是不是有些迷糊?我们可以自己来推导一下:
a = kb + n
如果b mod x=0,n mod x=0
那么 a = kb + n
a/x = kb/x + n/x
∵kb/x,n/x∈z
∴a/x∈z
∴a mod x = 0
∴若b与n可以被同一个数整除,则a自然也可以被该数整除。
它可以使用递归来实现。(返回条件:a = 0 or b = 0)
代码如下:
#include<iostream>
using namespace std;
unsigned int x,y;
unsigned int gcd(unsigned int a,unsigned int b) {
if(a==0) return b;if(b==0) return a;
return gcd(b,a%b);
}
int main() {
cin>>x>>y;
cout<<gcd(x,y);
}
#include<stdio.h>
unsigned int x,y;
unsigned int gcd(unsigned int a,unsigned int b) {
if(a==0) return b;if(b==0) return a;
return gcd(b,a%b);
}
int main() {
scanf("%d %d",&x,&y);
printf("%d",gcd(x,y));
}
x = 0
y = 0
def gcd(a,b) :
if a==0:
return b
if b==0:
return a
return gcd(b,a%b)
x = int(input())
y = int(input())
print(gcd(x,y))
利用辗转相除法求最小公倍数
既然知道了gcd的求法,我们便可以将其应用到求最小公倍数(Least Common Multiple)上。
lcm(a,b) = a*b/gcd(a,b) = a/gcd(a,b)*b .
我们可以对之前的代码稍稍添加一点:
#include<iostream>
using namespace std;
unsigned int x,y;
unsigned int gcd(unsigned int a,unsigned int b) {
if(a==0) return b;if(b==0) return a;
return gcd(b,a%b);
}
unsigned int lcm(unsigned int a,unsigned int b) {
return x/gcd(a,b)*y;
}
int main() {
cin>>x>>y;
cout<<lcm(x,y);
}
这是我写的第一篇文章,感谢支持!
如有错误,欢迎斧正!