将一个正整数分解质因数
题目
将一个正整数分解质因数。例如:输入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);
}
结束语
作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。