將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=233*5丑搔。
(1)如果這個(gè)質(zhì)數(shù)恰等于n厦瓢,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可啤月。
(2)如果n<>k旷痕,但n能被k整除,則應(yīng)打印出k的值顽冶,并用n除以k的商,作為新的正整數(shù)n,重復(fù)執(zhí)行第一步欺抗。
(3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步强重。
package Demo04Prime_Factorization;
import java.util.ArrayList;
import java.util.Scanner;
public class Prime_Factorization {
/**
* 將一個(gè)正整數(shù)分解質(zhì)因數(shù)绞呈。例如:輸入90,打印出90=2*3*3*5。
* (1)如果這個(gè)質(zhì)數(shù)恰等于n间景,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束佃声,打印出即可。
* (2)如果n<>k倘要,但n能被k整除圾亏,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)n,重復(fù)執(zhí)行第一步封拧。
* (3)如果n不能被k整除志鹃,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
*/
/*
分析(小學(xué)知識(shí)復(fù)習(xí)):
質(zhì)數(shù)的概念:指在大于1的自然數(shù)中泽西,除了1和它本身以外不再有其他因數(shù)的自然數(shù)曹铃,也就是除了1和它自身,不能被其他數(shù)整除捧杉。
合數(shù)的概念:與質(zhì)數(shù)正好相反陕见,就是除了1和它自身以外,還可以被別的數(shù)整除味抖。最小的合數(shù)是4评甜。
最小的質(zhì)數(shù)是2,所以分解一個(gè)合數(shù)的質(zhì)因數(shù)仔涩,則從2開始試除忍坷,如果余數(shù)為0,則2就是質(zhì)因數(shù)之一,把2記錄下來承匣,把商作為一個(gè)合數(shù)繼續(xù)
分解蓖乘,如果余數(shù)不為零,則應(yīng)該加一韧骗,也就是試除3嘉抒,如果余數(shù)為0,則3又是質(zhì)因數(shù)之一袍暴,記錄些侍,把商又作為一個(gè)合數(shù)來分解,依次類推……
*/
public static void main(String[] args) {
System.out.println("請(qǐng)輸入你要分解的合數(shù): ");
// Scanner類獲取用戶輸入的一個(gè)合數(shù)
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println("分解結(jié)果===========================");
// 定義一個(gè)集合來接收Prime_Factors()方法返回的list集合
ArrayList<Long> list = Prime_Factors(num);
// 打印該合數(shù)的所有質(zhì)因數(shù)
System.out.println("該合數(shù)的質(zhì)因數(shù)集合為:");
System.out.println(list);
// 遍歷所有的質(zhì)因數(shù)集合政模,就乘積岗宣,驗(yàn)證通過方法調(diào)用得到的分解質(zhì)因數(shù)結(jié)果對(duì)不對(duì),可以不寫
long pro=1;
for (int i = 0; i < list.size(); i++) {
pro=list.get(i)*pro;
// 格式化打印結(jié)果
if(i==0){
System.out.print(list.get(i));
}else if(i==list.size()-1){
System.out.println("*"+list.get(i)+"="+num);;
}else{
System.out.print("*"+list.get(i));
}
}
System.out.println("----------------------------------");
// 輸出判斷結(jié)果
if(pro==num){
System.out.println("本次分解質(zhì)因數(shù)結(jié)果已經(jīng)經(jīng)過驗(yàn)證淋样,結(jié)果正確耗式!");
}
}
/**
* 將用戶輸入的合數(shù)傳遞給方法,最后返回一個(gè)含有該數(shù)所有質(zhì)因數(shù)的集合趁猴。
* @param num
* @return
*/
public static ArrayList<Long> Prime_Factors(long num){
// 定義一個(gè)集合來盛這些質(zhì)因數(shù)
ArrayList<Long> list = new ArrayList<>();
// 定義一個(gè)變量裝商值
long n = num;
// 定義質(zhì)因數(shù)變量刊咳,從2開始
long k = 2;
// 開始循環(huán),遍歷2~n的所有數(shù)儡司,注意這個(gè)n是時(shí)刻變化的
while(k<=n){
// 如果這個(gè)質(zhì)因數(shù)就等于這個(gè)數(shù)娱挨,說明該數(shù)是一個(gè)質(zhì)數(shù),直接記錄并退出循環(huán)
if(k==n){
list.add(n);
break;
}
// 如果n可以被k整除捕犬,則k是n的質(zhì)因數(shù)跷坝,記錄這個(gè)質(zhì)因數(shù),并且把商值重新賦給n碉碉,k回到原點(diǎn)柴钻,重新開始
if(n%k==0){
list.add(k);
n=n/k;
k=2;
// 如果n不能被k整除,則k不是n的質(zhì)因數(shù)誉裆,k+1顿颅,再去除
}else{
k++;
}
}
// 返回這個(gè)數(shù)的質(zhì)因數(shù)集合
return list;
}
}