一、最大公因数
1.辗转相除法,又称欧几里得算法。用于计算两个正整数a,b的最大公因数和最小公倍数,其依赖于gcd(a,b) = a (b=0)和gcd(b,a mod b) (b!=0).
2.穷举法,也叫枚举法,求最大公约数时从两者中较小的数开始,由大到小列举,直到找到第一个公因数为止。
3.更相减损法,若两个正整数都为偶数,则用2约简,直到不能约简为止。然后用大数减小数,将差与较小的数比较,再以大数减小数,直到减数和差相等为止。
4. Stein算法,两个数均为偶数时有公因数2,且公因数一定为偶数。一个奇数一个偶数时,因为其奇偶性的不同,所以其最大公因数一定为奇数。当两个数均为奇数时,其最大公因数一定是奇数。
二、流程图
欧几里得算法 / 辗转相除法
穷举法 / 枚举法
更相减损法
Stein算法
三、代码展示
//求最小公因数
//欧几里得算法 / 辗转相除法
//第一种
int lcd(int a, int b)
{
int t;
while(a%b!=0)
{
t = a;
a = b;
b = t%b;
}
return b;
}
//第二种
int gcd(int a,int b)
{
if(a<b)
{
int t;
t=a;
a=b;
b=t;
}
int m;
while(b!=0)
{
m=a%b;
a=b;
b=m;
}
return a;
}
//函数递归调用
int gcd(int a, int b) {
if (a % b == 0) {
return b;
}
else {
return gcd(b, a % b);
}
}
//穷举法
int divisor1(int a, int b) {
int temp;
temp = (a > b) ? b : a; //求较小值
while (temp > 0) {
if (a % temp == 0 && b % temp == 0) {
break;
}
else {
temp--;
}
}
return (temp);
}
//更相减损法
int gcd1(int a, int b) {
int i = 0, temp, x = 0;
while (a % 2 == 0 && b % 2 == 0) { //m,n有公约数2时
a /= 2;
b /= 2;
i += 1;
}
//a,b的值互换
if (a < b) {
temp = a;
a = b;
b = temp;
}
while (x) {
x = a - b;
a = (b > x) ? b : x;
b = (b < x) ? b : x;
if (b == (a - b)) { //差和减数相等
break;
}
}
if (i == 0) {
return b;
}
else {
return (int)pow(2, i)*b;
}
}
//最小公倍数
//第一种:穷举法
int multiple1(int a, int b) {
int p, q, temp;
p = (a > b) ? a : b; //求两数中的最大值
q = (a > b) ? b : a; //求两数中的最小值
temp = p;
while (1) {
if (p % q == 0) {
break;
}
else {
p += temp;
}
}
return (p);
}
//第二种 枚举
int main()
{
while (cin >> a >> b)
{
for (i = b; i <= a * b; i++)
{
if (i%a == 0 && i%b == 0)
{
printf("%d\n", i);
break;
}
}
}
}
//第三种:最小公倍数=a*b/最大公因数