Java中分解質因數
分解質因數
任何一個合數都可以寫成幾個質數相乘的形式。其中每個質數都是這個合數的因數,叫做這個合數的分解質因數。分解質因數只針對合數。
分解質因數的原因:
源於對數學的熱愛,所以才會選擇做這樣一道題目,它的實際作用並不是很強。再者而言,做分解質因數可以幫助自己更好的理解方法之間的呼叫。前幾天的博文中,我寫了《找出1-n內的素數》,那篇文章中談到了自己是如何去尋找質數的,在本篇文章中我用到了判斷質數的方法;還有寫過一篇《統計兔子的數量》,在那篇文章中,我使用了遞迴函式的方法去解決問題,當時還不是十分的理解遞迴的應用,所以我嘗試在這個問題運用遞迴的方法去分解因數,果然,幫助自己節約了執行的時間。
題目分析:
- 題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
程式分析:
1.利用Scanner類得到一個正整數;
2.判斷得到的正整數是否是一個質數,否就執行下面步驟,
(1).分解質因數
(2).定義一個集合,用於裝分解出來的因數,
(3).對合數取商數和餘數
(4).對餘數進行判斷是否是質數,是就跳出迴圈,否就執行迴圈體,直至是質數
3.遍歷集合,打印出質因數。
程式碼塊:
1.得到一個int型別的整數:
其實得到一個int資料型別的整數,只需要前面兩行的程式碼,此處之所以寫的後面的兩行程式碼,主要是因為,後面用到了列表,所以就順便建立了一個Integer類,這樣就可以滿足方便定義List中的泛型
System.out.println("請輸入一個數用於因數分解:");
Scanner sc = new Scanner(System.in);
Integer m = new Integer(sc.nextInt());
int n = m;
2.建立一個分解因數的方法:
//建立一個方法用於分解因數
public static List<Integer> FenJie(int n){
//判斷得到的正整數是否是質數
if(!isPrime(n)){
//將n除以比n小的數
for(int m = 2; m < n;m++){
//如果出現m能夠被整除就將m加入因數集合中
if(n % m == 0 ){
//將被整除的數新增到list列表中
aList.add(m);
//將商數賦值給n,對n進行判斷
n /= m;
break;
}
}
//遞迴呼叫分解因數的方法
FenJie(n);
}else{
//將最後一個商數新增到list列表中
aList.add(n);
}
//將新增完因數的列表返回給主方法
return aList;
}
3.呼叫判斷質數的方法:
//建立一個方法用於判斷是否是質數
public static boolean isPrime(int n){
//定義一個變數用於判斷數是否是素數
boolean t = false;
//當數字時2的時候,是素數返回true
if(n==2){
t = true;
}
//當數字不是2的時候,進行進一步判斷
for(int j = 2;j < n;j++){
if(j==(n-1)){
t = true;
}
if((n % j)==0){
break;
}
}
return t;
}
4.遍歷集合並列印:
for(Integer list1 : aList){
System.out.print("*"+list1);
}
實現分解因數的完整的程式碼:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class DecompositionFactor {
/**
* @param args
* @作者:蔣毅
* @描述:
*/
public static List<Integer> aList = null;
public static void main(String[] args){
while(true){
//建立一個Scanner物件,獲得輸入數字
System.out.println("請輸入一個數用於因數分解:");
Scanner sc = new Scanner(System.in);
Integer m = new Integer(sc.nextInt());
int n = m;
//建立一個集合用於裝分解出來的因素
aList = new ArrayList<Integer>();
System.out.println(n+"分解因數後的結果:");
System.out.print(n+" = 1");
//分解因數
FenJie(n);
//遍歷aList列表
for(Integer list1 : aList){
System.out.print("*"+list1);
}
System.out.println("\r"+"----------------------");
}
}
//建立一個方法用於分解因數
public static List<Integer> FenJie(int n){
//判斷得到的正整數是否是質數
if(!isPrime(n)){
//將n除以比n小的數
for(int m = 2; m < n;m++){
//如果出現m能夠被整除就將m加入因數集合中
if(n % m == 0 ){
aList.add(m);
//將商數賦值給n,對n進行判斷
n /= m;
break;
}
}
FenJie(n);
}else{
aList.add(n);
}
return aList;
}
//建立一個方法用於判斷是否是質數
public static boolean isPrime(int n){
//定義一個變數用於判斷數是否是素數
boolean t = false;
//當數字時2的時候,是素數返回true
if(n==2){
t = true;
}
//當數字不是2的時候,進行進一步判斷
for(int j = 2;j < n;j++){
if(j==(n-1)){
t = true;
}
if((n % j)==0){
break;
}
}
return t;
}
}
總結:
今天感覺到寫部落格給自己帶來的好處了,之前總感覺寫部落格就是為了給別人看的,所以在寫的過程中沒有真正的透露自己的思想,現在感覺到,其實寫部落格是對自己經歷的一種回憶,它能夠幫助自更深刻的理解所學到的東西,也能夠提醒自己是時候總結一下經驗了,說不定在某個時刻,就用到了前面所記錄的東西。在這樣一個資訊的時代,人大腦的短暫的容納量還是有一定限度的,所以採用記筆記,寫日記的方法能夠幫助自己積累和記錄有趣的思想。
- 第五天的學習思維導圖: