几个基本数学问题

 

 

分解质因数

求最大公约数

求最小公倍数

牛顿迭代求平方根

 

 

分解质因数

import java.util.ArrayList;
import java.util.List;

public class Solution {

    // 返回质因数分解
    List<Integer> getPrimeFactors(int n) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 2; i <= n; i++) {
            // 注意while的终止条件是n!=i
            while (n != i) {
                if (n % i == 0) {
                    list.add(i);
                    n = n / i;
                } else
                    break;
            }
        }
        list.add(n);
        return list;

    }

    public static void main(String[] args) {
        System.out.println(new Solution().getPrimeFactors(120));

    }
}

 

求最大公约数

public class Solution {
    /**
     * 辗转相除法 缺点:对于大整数求模是瓶颈
     */
    public int gcd1(int x, int y) {
        return y == 0 ? x : gcd1(y, x % y);
    }

    /**
     * 更相减损术 缺点:某些case下递归次数太多,不如gcd(100000,1)的情况。
     */
    public int gcd2(int x, int y) {
        if (x < y)
            return gcd2(y, x);
        if (y == 0)
            return x;
        else
            return gcd2(x - y, y);

    }

    /**
     * 编程之美上的方法,避免了以上两种方法的劣势, 复杂度O(log(max(x,y)));
     */
    public int gcd(int x, int y) {
        if (x < y)
            return gcd(y, x);
        if (y == 0)
            return x;
        else {
            if (isEven(x)) {
                if (isEven(y)) {
                    return gcd(x >> 1, y >> 1) << 1;
                } else {
                    return gcd(x >> 1, y);
                }

            } else {
                if (isEven(y)) {
                    return gcd(x, y >> 1);
                } else {
                    return gcd(y, x - y);
                }

            }

        }

    }

    private boolean isEven(int x) {
        return (x & 1) == 0;
    }

    public static void main(String[] args) {
        int a = 420000, b = 3050;
        System.out.println(new Solution().gcd1(a, b));
        System.out.println(new Solution().gcd2(a, b));
        System.out.println(new Solution().gcd(a, b));

    }
}

 

求最小公倍数

x*y/gcd(x,y);

牛顿迭代求平方根

http://blog.csdn.net/sjf0115/article/details/8607378 

 

posted @ 2014-09-17 17:11  jdflyfly  阅读(212)  评论(0编辑  收藏  举报