将一个正整数分解质因数

题目

  将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。

基本概念

  质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其它自然数整除的数叫做质数;否则称为合数。规定1既不是质数也不是合数,最小的质数是2。

质因数(素因数或质因子)在数论里是指能整除给定正整数的质数(也可称为素数)。

  每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数;而这个因数一定是一个质数。

把一个合数分解成若干个质因数的乘积的形式,即求质因数的过程叫做分解质因数。
分解质因数只针对合数。(分解质因数也称分解素因数)求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式叫短除法,和除法的性质相似,还可以用来求多个数的公因式。

https://baike.baidu.com/item/分解质因数/2253749?fr=aladdin

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤递归完成:
(1) 如果 n = k,则因数分解结束,输出结果即可;
(2) 如果 n > k 且n能被k整除,则应打印出k的值,并用n除以k的商赋值给n,重复执行第一步;
(3) 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

夯实基础

  输入一个正整数,按照从小到大的顺序输出它的所有质因子,如果质因子重复,则列举重复值。譬如180的质因子为2*2*3*3*5

/**
 * 因数分解
 */
public static void getPrimeFactors(long num) {
    // 此处i 的上界不能为num/2,否则质数得不到结果,比如 163
    for (int i = 2; i <= num; i++) {
        if (num % i == 0) {
            System.out.print(i + " ");
            num = num / i;
            // 使下次循环时从当前 i 开始,减少不必要的循环
            i -= 1;
        }
    }
}

    public static void getPlusPrimeFactors(int num) {
        for (int i = 2; i <= num; ) {
            if (num % i == 0) {
                num /= i;
                if (i <= num) {
                    System.out.print(i + "*");
                } else {
                    System.out.print(i);
                }
            } else {
                // 不整除时 i++,减少不必要的循环
                i++;
            }
        }
    }

  getPlusPrimeFactors 函数规范了输出效果,而且,在num % i的模不为零时才使i递增。测试用例如下:

   public static void main(String[] args) {
        getPrimeFactors(163);
        System.out.println("---------");
        getPlusPrimeFactors(180);
    }

结束语

  作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。

posted @ 2022-12-31 10:26  楼兰胡杨  阅读(1715)  评论(0编辑  收藏  举报