10. 最大公约数&最小公倍数&加法原理&乘法原理&排列组合
- 10. 最大公约数&最小公倍数&加法原理&乘法原理&排列组合
- 约数&倍数
- 加法原理&乘法原理
- 排列组合
10. 最大公约数&最小公倍数&加法原理&乘法原理&排列组合
约数&倍数
约数,又称因数或因子。
整数 a 除以整数 b(b≠0) 除得的商正好是整数而没有余数,我们就说 a 能被 b 整除,或 b 能整除 a,记作:b|a。
a 称为 b 的倍数,b 称为 a 的约数。
在自然数(0和正整数)的范围内,任何正整数都是 0 的约数。
注意:一个数的约数必然包括1及其本身。
问:24的约数有哪些?
1 2 3 4 6 8 12 24
在大学之前,"约数"一词所指的一般只限于正约数。
约数和倍数都是二元关系的概念,不能孤立地说某个整数是约数或倍数。
一个整数的约数是有限的。同时,它可以在特定情况下成为公约数。
如果一个数 c 既是数 a 的因数,又是数 b 的因数,那么 c 叫做 a 与 b 的公因数/公约数。
两个数的公约数中最大的一个,叫做这两个数的最大公约数,如:
12 的约数有:1 2 3 4 6 12
24 的约数有:1 2 3 4 6 8 12 24
则 12 与 24 的公约数有:1 2 3 4 6 12。
其中 12 是最大的,我们就称 12 为两者的最大公约数。
倍数:当 a/b=q...r(r=0)时,称 a 为 b 的倍数,记做: b|a。
公倍数:两个数的公共倍数,如:
12 的倍数有:12 24 36 48 ...
24 的倍数有:24 48 72 96 ...
显而易见,12 与24 的倍数都是无限的,且具有无限的公倍数:24 48 ...
其中 24 是最小的,我们就称 24 为两者的最小公倍数。
那么如果让你来分析 任意两个数的最大公约数与最小公倍数,有信心吗?
【题目描述】输入 a,b, 求他们的最大公约数与最小公倍数。
【输入样例】12 20
【输出样例】4 60
先自己思考吧!
相信你可以想到不止一种解法!
求最大公约数的三种方法:
- 最小递减法
先找 a,b 的最小值,判断该值能否同时被 a,b 整除,如果可以该数就是答案,否则每次-1,继续判断,直到找到答案。
int gcd(int a, int b){
for(int i=min(a,b); i>=1; i--){
if(a%i==0 && b%i==0) return i;
}
}
- 更相减损法
a-b=c,则 a,b 的最大公约数就是 b,c 的最大公约数,如果 c=0,a 就是答案。
int gcd(int a, int b){
if(a
- 辗转相除法
a/b=q...r,则 a,b 的最大公约数就是 b,r 的最大公约数,如果 r=0,则 b 就是答案。
int gcd(int a, int b){
if(b==0) return a;
return gcd(b, a%b);
}
求最小公倍数的两种方法:
- 最大递增法
先找 a,b 的最大值,判断该值能否同时整除 a,b,如果可以该数就是答案,否则每次+1,继续判断,直到找到答案。
int lcm(int a, int b){
for(int i=max(a,b); i<=a*b; i++){
if(i%a==0 && i%b==0) return i;
}
}
- 定理法:两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。
int lcm(int a, int b){
return a*b/gcd(a,b);
}
#include
//最小递减法求最大公约数
int gcd1(int a, int b){
for(int i=min(a,b); i>=1; i--){
if(a%i==0 && b%i==0) return i;
}
return 1;
}
//更相减损法求最大公约数
int gcd2(int a, int b){
if(a