最近大学的一个同学给我发了个数学题:计算1到20的最小公倍数(Least Common Multiple,缩写L.C.M.)!
刚拿到题目的时候,就发现自己闷了,貌似已经N年没接触过数学名词了哈哈~
思考了一会就想到一种方法----1~20,将这些数分解质因子!代码如下java版的!^_^
- package javad.custom.thr;
- import java.math.BigDecimal;
- import java.util.ArrayList;
- import java.util.List;
- public class Calculate {
- public static void main(String[] args) {
- long start = System.nanoTime();//用于测试程序性能-计算程序用时的,不需要多想!
- Calculate c = new Calculate();
- int result = 1;//最后公倍数--结果,初始值为1
- for (int i = 1; i <= 20; i++) {//循环20次
- if (result % i == 0)//如果当前公倍数已经能被i整除就直接下一个数
- continue;
- List<Integer> tempNum = c.getPrimeNumber(i);//获取i的质因子数组
- int temp = result;//一个公倍数的copy
- for (int j = 0; j < tempNum.size(); j++) {
- //计算过程:如果能被质因子整除,则将copy保存为整除后的数--
- if (temp % tempNum.get(j) == 0) {
- temp /= tempNum.get(j);
- } else {
- //否则,直接在公倍数上乘以这个数--出来一个新的公倍数
- result *= tempNum.get(j);
- }
- }
- }
- System.out.println(result);
- System.out.println((System.nanoTime() - start));
- }
- public List<Integer> getPrimeNumber(int input) {
- int k = input / 2;
- List<Integer> result = new ArrayList<Integer>();
- for (int i = 2; i <= k; i++) {
- while (input % i == 0) {
- result.add(i);
- input /= i;
- }
- }
- if (result.size() < 2) {
- result.add(input);
- }
- return result;
- }
- }
最早的想法是这样的,后来我同学有了一个新的想法(哎,我也不知道他怎么这么有动力那……真是生猛的人)!利用最大公约数!思路如下!
假设gcd(a,b)为求最大公约数的一个方法!则可以这样写程序:
int result=1;
for (int i=1;i<=20;i++)
{
result*=i/gcd(result,i);//太经典了!哎,我脑子秀逗了!!!还写出上面那么复杂的东西来,丢人那,看来得恶补数学了。
}
看来得恶补数学啦。
::::::::::: ::::::::::: 来个数学补课--小学生级::::::::::: :::::::::::
Greatest common divisor-最大公约数:只几个数的共有公约数中的最大的一个。
最大公约数有的性质:
1.交换律 gcd(a,b)=gcd(b,a)
2.gcd(-a,b)=gcd(a,b)//正负数只要绝对值相同,公约数不变
3.gcd(a,a)=|a|//任何数,与自己的最大公约数就是自己
4.d(a,0)=|a|
5.gcd(a,1)=1
6.gcd(a,b)=gcd(b, a mod b)//a除以b得到的余数与a,b的最大公约数相同--很重要的性质
gcd(a,b)=b//当且仅当a是b的倍数--
7.gcd(a,b)=gcd(b, a-b)
8.如果有附加的一个自然数m,则: gcd(ma,mb)=m * gcd(a,b) (分配率)
9.gcd(a+mb ,b)=gcd(a,b)如果m是a和b的最大公约数,则: gcd(a/m ,b/m)=gcd(a,b)/m
10.在乘法函数中有:gcd(ab,m)=gcd(a,m) * gcd(b,m)
下面这个也是重点,两个整数的最大公约数主要有两种寻找方法:
* 两数各分解质因子,然后取出同样有的项乘起来
* 辗转相除法--经典啊--都不晓得有这样的算法
辗转相除法是利用以下性質來確定两个正整数 a 和 b 的最大公因數的:
1.若 r 是 a ÷ b 的餘數, 則 gcd(a,b) = gcd(b,r)
2.a 和其倍數之最大公因數為 a。
另一種寫法是:
a ÷ b,令r为所得餘数(0≤r<b)
若 r = 0,算法结束;b 即为答案。
互换:置 a←b,b←r,并返回第一步。
小技巧:计算最小公倍数时,通常会借助最大公因数!比如求20 和15的最小公倍数,就会这样求--20*15/最大公因数(这里是5)!