1. 程式人生 > >Java中分解質因數

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;
    }
}

總結:

今天感覺到寫部落格給自己帶來的好處了,之前總感覺寫部落格就是為了給別人看的,所以在寫的過程中沒有真正的透露自己的思想,現在感覺到,其實寫部落格是對自己經歷的一種回憶,它能夠幫助自更深刻的理解所學到的東西,也能夠提醒自己是時候總結一下經驗了,說不定在某個時刻,就用到了前面所記錄的東西。在這樣一個資訊的時代,人大腦的短暫的容納量還是有一定限度的,所以採用記筆記,寫日記的方法能夠幫助自己積累和記錄有趣的思想。


  • 第五天的學習思維導圖:
    這裡寫圖片描述