1. 求两个数的最大公约数,最小公倍数
解释:这里Mymin和Mymax函数是自定义用于获取两数最大值和最小值的
求最大公约数的时候只需要得到两数之中最小的一项,向下逐个判断直到等于1
求最小公倍数的时候只需要得到两数之中最大的一项,向上判断直到两数乘积即可
#include<iostream>
using namespace std;
int Mymin(int x,int y)
{if (x > y)return y;else return x;
}
int Mymax(int x, int y)
{if (x > y)return x;else return y;
}int GCD(int x, int y)
{int _min=Mymin(x, y);for (int i = _min; i >= 1; i--){if (x % i == 0 && y % i == 0){return i;}}
}
int LCM(int x, int y)
{int _max = Mymax(x, y);for (int i = _max;i<=x*y; i++){if (i % x == 0 && i % y == 0){return i;break;}}
}
2. 当然这是最复杂的办法,那么有没有简单一点的办法来求最大公约数和最小公倍数呢?
当然有,我们可以用辗转相除法来求最大公约数
最小公倍数可以通过公式:两数乘积/两数的最大公约数 得到
辗转相除法图示:
int GCD1(int x, int y)
{while (y){int z = x % y;x = y;y = z;}return x;int LCM1(int x, int y)
{return x * y / GCD1(x, y);
}
3. 我们已经直到如何求两个数的最大公约数,最小公倍数了,现在我们可以求出三个数或者更多数的最大公约数和最小公倍数吗?
如下所示,我们可以先求两个数的最大公约数或最小公倍数,然后再求第三个数的和前两个数的最大公约数或者最小公倍数的最大公约数或最小公倍数
int LCM2(int x, int y, int z)
{return LCM1(LCM1(x, y), z);
}
int GCD2(int x, int y, int z)
{return GCD1(GCD1(x, y), z);
}
本文仅阐述函数写法,主函数调用均省略。