数学概念之最大公约数!!哎~都不知道这些东西原来这么有用……

来源:互联网 发布:网络支付的规模 编辑:程序博客网 时间:2024/05/25 18:12

        

        最近大学的一个同学给我发了个数学题:计算1到20的最小公倍数(Least Common Multiple,缩写L.C.M.)!

        刚拿到题目的时候,就发现自己闷了,貌似已经N年没接触过数学名词了哈哈~

        思考了一会就想到一种方法----1~20,将这些数分解质因子!代码如下java版的!^_^

        

  1. package javad.custom.thr;
  2. import java.math.BigDecimal;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class Calculate {
  6.     public static void main(String[] args) {
  7.         long start = System.nanoTime();//用于测试程序性能-计算程序用时的,不需要多想!
  8.         Calculate c = new Calculate();
  9.         int result = 1;//最后公倍数--结果,初始值为1
  10.         for (int i = 1; i <= 20; i++) {//循环20次
  11.             if (result % i == 0)//如果当前公倍数已经能被i整除就直接下一个数
  12.                 continue;
  13.             List<Integer> tempNum = c.getPrimeNumber(i);//获取i的质因子数组
  14.             
  15.             int temp = result;//一个公倍数的copy
  16.             for (int j = 0; j < tempNum.size(); j++) {
  17. //计算过程:如果能被质因子整除,则将copy保存为整除后的数--
  18.                 if (temp % tempNum.get(j) == 0) {
  19.                     temp /= tempNum.get(j);
  20.                 } else {
  21. //否则,直接在公倍数上乘以这个数--出来一个新的公倍数
  22.                     result *= tempNum.get(j);
  23.                 }
  24.             }
  25.         }
  26.         System.out.println(result);
  27.         System.out.println((System.nanoTime() - start));
  28.     }
  29.     public List<Integer> getPrimeNumber(int input) {
  30.         int k = input / 2;
  31.         List<Integer> result = new ArrayList<Integer>();
  32.         for (int i = 2; i <= k; i++) {
  33.             while (input % i == 0) {
  34.                 result.add(i);
  35.                 input /= i;
  36.             }
  37.         }
  38.         if (result.size() < 2) {
  39.             result.add(input);
  40.         }
  41.         return result;
  42.     }
  43. }

            最早的想法是这样的,后来我同学有了一个新的想法(哎,我也不知道他怎么这么有动力那……真是生猛的人)!利用最大公约数!思路如下!

            假设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)!

    

            

 

 

 

            

原创粉丝点击