恬然自得.活在當下: [功課]輸入一數檢查其是否為質數,並做質因數分解

2011年4月13日 星期三

[功課]輸入一數檢查其是否為質數,並做質因數分解

這次的功課老師出了兩個,第二個就是要做質因數分解,要先檢查該數是否為質數,如果是質數就直接顯示說是質數即可,若不是則必須顯示它有哪些質因數。

其實在實作上,我用的是比較簡單的方法,當然可以有人挑戰一下比較難的XD比方說先找出122483底下的所有質數,之後再用找到的這些質數來除以122483,如果能夠整除以0,那這個數就是122483的質因數;至於找出質數有一些數學公式可以用,維基百科上能看見一堆,可惜我絕對不是算數的料,那些公式都看不懂0.0”

貼上輸出結果:
請輸入一個數字,系統將判斷此數是否為質數:122483
質因數分解:53* 2311* 1
122483不是一個質數。它的質因數有[1, 53, 2311]

請輸入一個數字,系統將判斷此數是否為質數:174799
174799為一個質數。



寫法僅供參考,畢竟Java才學了半年左右吧 >”<
(大家記得註解和程式碼要自己重新打過唷,工讀生會檢查;比方說將for迴圈改成whilewhile改成for,另外變數名稱和註解內容也修改掉)

程式碼如下:

import java.util.Scanner;
import java.util.TreeSet;


public class s11967046 {
  
 /* 請寫出由使用者輸入數字後判斷該數是否為質數的程式。
  *  若該數不是質數,則顯示出該數被質因數分解後的所有質因數。 
  *  質數的意義為該數除了本身和1之外沒有其他因數的數字。
  *  非質數的質因數分解只有一種形式, 
  *  例如,數字54的質因數分解為2、3、3及 3。
  *  這些因數的乘積為54。所以54的質因數為2和3。
  *  請在您的程式中使用Sets的功能。
  */
 
 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  System.out.print("請輸入一個數字,系統將判斷此數是否為質數:");
  int number = sc.nextInt();
  int result = number; //宣告result只是因為底下的算式會改變原來的number
        //所以改用result來做運算,number留著輸出結果@@"
    
  //使用TreeSet是因為它具有排序性,後面顯示出來比較好看
  TreeSet <Integer> sets = new TreeSet <integer>();
  
  //透過checkPrimeNumber先判斷數字是否為質數
  if (checkPrimeNumber(number)){
   System.out.print(number + "為一個質數。");
  }
  
  else{
   
   System.out.print("質因數分解:");
   while(true){
    for (int i = 2 ; i <= result;i++){
     //從2開始除,因為只要遇到整除就break迴圈
     // 基本上已經將不是質因數的可能性去除了
     // 如偶數在前半段整除以2時都會被去掉
     // 3的倍數、5的倍數等等也不可能會遇到
      
     if ( result % i  == 0){           
      System.out.print(i+ "* ");
      //將result除以可以整除的數,逐步縮小範圍
      result = result / i;
      //把質因數加入sets中
      sets.add(i);
      //跳離for迴圈,但因為while所以重頭再來
      break;   
     }
    }
    //最後得出1就可以直接輸出了,跳離while迴圈
    if (result == 1){
     System.out.println("1");
     //之前搞錯了@@",1可以不用加入集合中
     //sets.add(1);
     break;
    }
   }
    System.out.print(number + "不是一個質數。" 
        + "它的質因數有" + sets);
  }

 }
 
  //檢查數字是否為質數的方法
 static boolean checkPrimeNumber (int number){
  int counter = 0;
  
  for(int i =1; i<=number ;i++){
   //從1開始確認能夠整除number的數有幾個
   if(number % i == 0){
    counter ++;
   }
  }
  
  //若counter計數小於2
  //代表能夠被整除的數字只有1和它自己
  if (counter <=2){
   //它是一個質數,回傳true
   return true;
  }
  else{
   //它不是一個質數,回傳false
   return false;
  }
  
  
 }
}

沒有留言:

張貼留言

歡迎提供良性建議^_^