1.最大公约数
一般使用辗转相除法即欧几里得算法来计算。
设有两数a,b,求这两个数的最大公约数
代码如下:
这里有一个性质:设有两数a,b,求这两个数的最大公约数
gcd(a,b)=gcd(b,a%b) 且等同于 gcd(a,b)=gcd(b,a-b),因为多减几次相当于a%b了
这里使用了三目运算符:x?a:b
当x为true时,整个表达式为a的值;当x为false时,整个表达式为b的值。
形式(1)
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int gcd(int a,int b) 5 { 6 return b?gcd(b,a%b):a; 7 } 8 int main() 9 { 10 int a,b; 11 cin>>a>>b; 12 int ans=gcd(a,b); 13 cout<<ans; 14 return 0; 15 }
形式(2)
#include<iostream> #include<cstdio> using namespace std; int gcd(int x,int y) { int t; while(y) { t=x%y; x=y; y=t; } return x; } int main() { int a,b; cin>>a>>b; int ans=gcd(a,b); cout<<ans; return 0; }
2.最小公倍数
可利用公式
gcd(a,b)*lcm(a,b)=a*b
来计算
设有两数a,b,求这两个数的最小公倍数
代码如下:
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main() { int a,b; cin>>a>>b; int ans=(a*b)/gcd(a,b); cout<<ans; return 0; }