最大公约数
概念:多个数中共同的约数中最大的一个。
如16和24共同的约数为8,4,2,1,其中最大的为8,即为16和24的最大公约数。
四种方法总结如下:
第一种:穷举法之一
解释:拿其中一个数出来,用一个临时变量(tem)保存,每次都把那两个数除以这个临时变量。如果能除断,直接返回tem;如果不能除断,tem- -,直到都能除断,再返回tem。tem就是它们的最大公约数。
int main(){ int m, n; cin >> m >> n; int gys;// 公约数gys if(n<m) gys = n; else gys = m; while(m%gys!=0 || n%gys!=0) { gys --; } cout << gys; return 0; }
最小公倍数
概念:多个数共同的倍数中最小的一个。
如3和5的共同的倍数有15,30,45,···,其中最小的一个为15,即为3和5的最小公倍数。
可以通过两个数的积除以它们的最大公约数得到。
第二种:穷举法之二
解释:求出两数的所有公因子,再把公因子累乘得到最大公约数。
#include <iostream> using namespace std; int CommFactor2(int m, int n); //函数的声明 int main() { int a, b; cin >> a >> b; cout << "这两个数的最大公约数为:" << CommFactor2(a,b)<< endl; return 0; } int CommFactor2(int m,int n) { int i; int factor = 1; for (i=2;i<=m&&i<<n;i++) { while(m % i == 0 && n % i == 0) //这里不能用if语句,因为可能会有重复的公因子 { factor = factor * i; m = m / i; n = n / i; } } return factor; }
第三种:辗转相除法
解释
用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。
原理
a/b=q余r,除数b和余数r能被同一个数整除,那么被除数a也能被这个数整除。或者说,除数与余数的最大公约数,就是被除数与除数的最大公约数。即被除数与除数的最大公约数,就是除数与余数的最大公约数。
例子:9/6=1余3,除数6和3能被同一个数3整除,那么被除数9也能被这个数3整除
#include <bits/stdc++.h> using namespace std; int gcd(int a, int b) { if (a < b) { swap(a, b); } int r = a % b; if (r == 0) { return b; } else { return gcd(b, r); } }
第四种:辗转相减法
解释:将两个数辗转相减直到两数相等。(具体思想请问度娘)
#include <iostream> using namespace std; int CommFactor4(int m, int n); //函数的声明 int main() { int a, b; cin >> a >> b; cout << "这两个数的最大公约数为:" << CommFactor4(a,b)<< endl; return 0; } int CommFactor4(int m,int n) { while (m != n) { if (m > n) { m = m - n; } else { n = n - m; } } return m; }
第五种 alogorithm库封装函数
在库中有一个函数__gcd()可以返回两个数的最大公约数
#include<algorithm> #include<iostream> using namespace std; int main() { cout << __gcd(12, 16);// 4 return 0; }