【C++】两个或多个数的最大公约数(gcd)、最小公倍数(lcm)算法

您所在的位置:网站首页 gcd格式 【C++】两个或多个数的最大公约数(gcd)、最小公倍数(lcm)算法

【C++】两个或多个数的最大公约数(gcd)、最小公倍数(lcm)算法

2023-12-14 07:17| 来源: 网络整理| 查看: 265

最大公约数、最小公倍数算法 1、求最大公约数(gcd)(1)更相减损术(2)辗转相除法(欧几里得算法)(3)求多个数的最大公约数 2、求最小公倍数(lcm)(1)求两个数的最小公倍数(2)求多个数的最小公倍数

1、求最大公约数(gcd)

最大公约数(greatest common divisor,简写为 gcd ;或highest common factor,简写为hcf),指某几个整数共有因子中最大的一个。

(1)更相减损术

注意,更相减损术算法的耗时长,一般不推荐使用。

更相减损术百度百科 代码如下: 非递归形式

int gcd(int a, int b) { while (a != b) { if (a > b)a -= b; else b -= a; } return a; }

递归形式 这个gcd函数在正int型内完全通用,返回a,b的最大公约数 但是当a,b之间差距较大时(如100000倍)会导致错误(栈过深)

int gcd(int a, int b) { if (a == b)return a; else if (a > b)a -= b; else b -= a; return gcd(a, b); } (2)辗转相除法(欧几里得算法)

求最大公约数,一般都会使用此算法。

欧几里得算法百度百科 代码如下: 非递归形式:

int gcd(int a, int b) { int temp = b; while (a % b) { //辗转相除 temp = a % b; a = b; b = temp; } return temp; }

递归形式一:

int gcd(int a, int b) { if (a % b == 0) return b; else return gcd(b, a % b); }

递归形式二:

int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } (3)求多个数的最大公约数

我们可以先求出前两个数的最大公约数(a),再用这个最大公约数(a)与下一个数求出它们的最大公约数(b),不断循环直到计算完所有数。

#include using namespace std; int gcd(int a, int b) { if (a % b == 0) return b; else return gcd(b, a % b); } int main() { int a[8] = { 32,16,12,24,36,20,40,28 }; //最大公约数:4 int L = sizeof(a) / sizeof(int); //L为元素个数 int m = a[0]; //初始化最大公约数:a[0] for (int i = 1; i return a > b; } int gcd(int num[], int n) //求多个数的最大公约数的算法 { sort(num, num + n, cmp); while (num[0] != num[n - 1]) { for (int i = 0; i int a[8] = { 32,16,12,24,36,20,40,28 }; //最大公约数:4 int L = sizeof(a) / sizeof(int); //L为元素个数 cout int temp = a * b; temp = temp / gcd(a, b); return temp; } (2)求多个数的最小公倍数

我们可以先求出前两个数的最小公倍数(a),再用这个最小公倍数(a)与下一个数求出它们的最小公倍数(b),不断循环直到计算完所有数。

#include using namespace std; int gcd(int a, int b) { if (a % b == 0) return b; else return gcd(b, a % b); } int lcm(int a, int b) { int temp = a * b; temp = temp / gcd(a, b); return temp; } int main() { int a[4] = { 40,20,10,30 }; //最小公倍数:120 int L = sizeof(a) / sizeof(int); //L为元素个数 int m = a[0]; //初始化最小公倍数:a[0] for (int i = 1; i if (a % b == 0) return b; else return gcd(b, a % b); } ll lcm(ll a, ll b) { ll temp = a * b; temp = temp / gcd(a, b); return temp; } int main() { int n; while (cin >> n) { for (int i = 0; i m = m * a[i] / gcd(m, a[i]); } cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3