求最小公倍数(GCD)和最大公约数(LCM)——原理和代码
一、最大公约数(GCD)
两个整数 a 和 b 的最大公约数是能同时整除 a 和 b 的最大正整数。
求法:欧几里得算法(辗转相除法)
原理:
gcd(a, b) = gcd(b, a % b) 直到 b == 0,此时 a 就是最大公约数。
//计算两个整数的最大公约数(GCD)
//使用辗转相除法(欧几里得算法)
int gcd(int a,int b){if (a == 0) return abs(b);if (b == 0) return abs(a);// 取绝对值,保证算法在正整数上运行a = abs(a);b = abs(b);while(b!=0){int r = a% b;a = b;b = r;}return a;
}
二、最小公倍数(LCM)
两个整数 a 和 b 的最小公倍数是整数公有的倍数中,最小的那个正整数。
求法: 利用最大公约数
lcm(a, b) = |a * b| / gcd(a, b)
//计算两个整数的最小公倍数(LCM)
//利用公式:LCM(a, b) = |a*b| / GCD(a, b)
int lcm(int a,int b){if(a==0 || b==0) return 0;return abs(a*b) / gcd(a,b);
}
测试:
#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;//计算两个整数的最大公约数(GCD)
//使用辗转相除法(欧几里得算法)
int gcd(int a,int b){if (a == 0) return abs(b);if (b == 0) return abs(a);// 取绝对值,保证算法在正整数上运行a = abs(a);b = abs(b);while(b!=0){int r = a% b;a = b;b = r;}return a;
}
//计算两个整数的最小公倍数(LCM)
//利用公式:LCM(a, b) = |a*b| / GCD(a, b)
int lcm(int a,int b){if(a==0 || b==0) return 0;return abs(a*b) / gcd(a,b);
}int main()
{// 基本测试cout << "GCD(48, 18) = " << gcd(48, 18) << endl; // 输出:6cout << "LCM(48, 18) = " << lcm(48, 18) << endl; // 输出:144// 含负数的测试cout << "GCD(-48, 18) = " << gcd(-48, 18) << endl; // 输出:6cout << "LCM(-48, -18) = " << lcm(-48, -18) << endl; // 输出:144// 含0的测试cout << "GCD(0, 12) = " << gcd(0, 12) << endl; // 输出:12cout << "LCM(0, 12) = " << lcm(0, 12) << endl; // 输出:0(表示无意义)return 0;
}