題目描述:
將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90 = 2 * 3 * 3 * 5。
概念梳理:
什么是質(zhì)數(shù)?
質(zhì)數(shù)(Prime Number),是指在大于
1的自然數(shù)中,只能被1和它本身整除的自然數(shù)。
如何判斷整除?
給定除數(shù)
n和被除數(shù)N,如果N / n的余數(shù)為零,則稱N能被n整除。
在編程中,可用取模運(yùn)算判斷整除問(wèn)題。
什么叫分解質(zhì)因數(shù)?
即將一個(gè)合數(shù)寫成幾個(gè)質(zhì)數(shù)相乘的形式,就叫做分解質(zhì)因數(shù)。
思路分析:
- 根據(jù)質(zhì)數(shù)的定義,實(shí)現(xiàn)一個(gè)算法,用于判斷一個(gè)自然數(shù)是不是質(zhì)數(shù);
- 找出
1~N中所有的質(zhì)數(shù); - 循環(huán)判斷
N能否被1~N中的質(zhì)數(shù)整除,如果能被整除,則該質(zhì)數(shù)為N的一個(gè)質(zhì)因數(shù); - 拿到第3步整除后的結(jié)果,重復(fù)執(zhí)行第2、3兩步,直到整除的結(jié)果也是一個(gè)質(zhì)數(shù)為止。
代碼實(shí)現(xiàn):
- 判斷一個(gè)數(shù)是否為質(zhì)數(shù)
/**
* 判斷一個(gè)是否為質(zhì)數(shù)
* 如果一個(gè)數(shù)n只能被1或n整除,則該數(shù)為質(zhì)數(shù),即:
* 如果一個(gè)數(shù)n不能被1~n之間的任何數(shù)整除,則該數(shù)為質(zhì)數(shù)。
*/
public boolean isPrimeNumber(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
- 遞歸分解質(zhì)因數(shù)
public void factoringNumber(int n) {
if (isPrimeNumber(n)) {
System.out.print(n); // 直到n為質(zhì)數(shù),分解質(zhì)因數(shù)完成
return;
}
for (int i = 2; i < n; i++) {
if (isPrimeNumber(i)) { // i是否為質(zhì)數(shù)
if (n % i == 0) { // n 能否被i整除
System.out.print(i + " * ");
int result = n / i; // 整除后的結(jié)果
factoringNumber(result); // 遞歸分解質(zhì)因數(shù)
break; // 注意:找到一個(gè)質(zhì)因數(shù)后即退出循環(huán)
}
}
}
}
- 分解質(zhì)因數(shù)測(cè)試
factoringNumber(1001); // 7 * 11 * 13
總結(jié):
解決問(wèn)題,第一步要做的就是弄清除題目中的各個(gè)基本概念。如果基本概念不清楚,是很難正確地思考的。
比如本題中,首先要弄清的就是質(zhì)數(shù)、整除、余數(shù)、分解質(zhì)因數(shù)等概念。對(duì)基本概念有了深入的理解后,解決問(wèn)題起來(lái)就如虎添翼了。
題目里有一個(gè)值得注意的地方,就是在找到一個(gè)質(zhì)因數(shù)后,要退出循環(huán),否則會(huì)循環(huán)會(huì)繼續(xù)執(zhí)行。
遇到代碼執(zhí)行結(jié)果與預(yù)期結(jié)果不符時(shí),要冷靜分析,只需要按照代碼邏輯(Debug)在大腦里執(zhí)行一遍即可。