最大公约数和最小公倍数基本模板(gcd和lcm)
首先是最大公约数,这有2种写法,一个是省事一点地递归写法:
#include <iostream> #include <cstdio> using namespace std; int gcd(int a, int b) { return a%b==0 ? b:gcd(b, a%b); } int main() { int a, b; while(true) { scanf("%d%d", &a, &b); printf("%d\n", gcd(a, b)); } }
原理其实很简单,就是模拟辗转相除法
首先算法若a < b, 算法会转换一下a 和 b,
然后对他们取余数, 并用较小的数再次求余,直到余数为0, 最小的数就是最大公约数!
数学也可以用来推倒:
nx % x == 0 时 x 为最大公约数。
下面是这个思路的速度较快的算法:
#include <iostream> #include <cstdio> using namespace std; int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a%b); } int main() { int a, b; while(true) { scanf("%d%d", &a, &b); printf("%d\n", gcd(a, b)); } }
这个因为没有递归,所以速度快些,大数的时候可以改long long 用这个!
下面是延伸一下就可以得到最小公倍数(lcm)模板了:
由于a*b除以他们的最大公约数就是最小公倍数。
故而有:
#include <iostream> #include <cstdio> using namespace std; int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a%b); } int lcm(int a, int b) { return a/gcd(a, b)*b; //注意这里的顺序, a*b再除以最小公倍数!这样错误率低!亲测! } int main() { int a, b; while(true) { scanf("%d%d", &a, &b); printf("%d %d\n", gcd(a, b), lcm(a, b)); } }
如有疑问,欢迎评论指出!
化繁为简 大巧不工