1.枚举法
#include <iostream>
using namespace std;
// 求最大公约数
int gcd(int a, int b)
{
int temp = a > b ? b : a;
while (temp)
{
if (a % temp == 0 && b % temp == 0)
{
break;
}
--temp;
}
return temp;
}
int main()
{
int a, b;
cin >> a >> b;
cout <<"最大公约数为:"<<gcd(a, b)<<endl;
cout<<"最小公倍数为:"<<a/gcd(a,b)*b<< endl;//求最小公倍数先除后乘,防止溢出爆int
return 0;
}
2.递归法
#include<iostream>
using namespace std;
int gcd(int a, int b) {
return a%b==0?b:gcd(b, a % b);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a,b;
cin>>a>>b;
cout<<"最大公约数为:"<<gcd(a,b)<<endl;
cout<<"最小公倍数为:"<<a/gcd(a,b)*b<<endl;//求最小公倍数先除后乘,防止溢出爆int
return 0;
}
3.辗转相除法(同上递归思想)
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
int r;
// 当a不能被b整除完全时
// 令a=b b=a%b
// 重复循坏 直到a%b==0
// 返回b b就是最大公因数
while (a % b != 0)
{
r = a % b;
a = b;
b = r;
}
return b;
}
int main()
{
int a, b;
cin >> a >> b;
cout<<"最大公约数为:"<<gcd(a,b)<<endl;
cout<<"最小公倍数为:"<<a/gcd(a,b)*b<<endl;//求最小公倍数先除后乘,防止溢出爆int
return 0;
}
4.更相减损法
#include <iostream>
#include <math.h>
using namespace std;
// 求最大公约数
int gcd(int a, int b)
{
// 判断两数是否都是偶数
// 若都是 则都除以2
// 直到其中一个数为奇数
int count = 0;// 记录2的个数
while (a % 2 == 0 && b % 2 == 0)
{
a /= 2;
b /= 2;
++count;
}
// 当a!=b时
// 用a、b中的较大数减去较小数字
// 一直循环 直到a==b
while (a != b)
{
if (a > b)
{
a -= b;
}
else
{
b -= a;
}
}
// 注意需要乘以count个2
return a * pow(2, count);
}
int main()
{
int a, b;
cin >> a >> b;
cout<<"最大公约数为:"<<gcd(a,b)<<endl;
cout<<"最小公倍数为:"<<a/gcd(a,b)*b<<endl;//求最小公倍数先除后乘,防止溢出爆int
return 0;
}
5.调用C++库函数
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a,b;
cin>>a>>b;
cout<<"最大公约数为:"<<__gcd(a,b)<<endl;
cout<<"最小公倍数为:"<<a/__gcd(a,b)*b<<endl;//求最小公倍数先除后乘,防止溢出爆int
return 0;
}
6.Stein算法
#include <iostream>
#include <math.h>
using namespace std;
// 求最大公约数
int gcd(int a, int b)
{
int count = 0;
if (a == b)
return a;
if (a == 0)
return b;
if (b == 0)
return a;
while (a != b)
{
// a&1==1 说明a是奇数 与a%2==1得到的效果一样
// 都是判断a是奇数还是偶数
if (a & 1)
{
if (b & 1)
{
//a,b都是奇数时
// 提前存储a 因为后面a变了
int temp = a;
a = abs(a - b) >> 1;
b = min(temp, b);
}
else
{
//a是奇数 b是偶数
b >>= 1;
}
}
else
{
if (b & 1)
{
//a是偶数 b是奇数
a >>= 1;
}
else
{
//a、b都是偶数
a >>= 1;
b >>= 1;
++count;
}
}
}
return a << count;
}
int main()
{
int a, b;
cin >> a >> b;
cout<<"最大公约数为:"<<gcd(a,b)<<endl;
cout<<"最小公倍数为:"<<a/gcd(a,b)*b<<endl;//求最小公倍数先除后乘,防止溢出爆int
return 0;
}