這次的功課老師出了兩個,第二個就是要做質因數分解,要先檢查該數是否為質數,如果是質數就直接顯示說是質數即可,若不是則必須顯示它有哪些質因數。
其實在實作上,我用的是比較簡單的方法,當然可以有人挑戰一下比較難的XD比方說先找出122483底下的所有質數,之後再用找到的這些質數來除以122483,如果能夠整除以0,那這個數就是122483的質因數;至於找出質數有一些數學公式可以用,維基百科上能看見一堆,可惜我絕對不是算數的料,那些公式都看不懂0.0”
貼上輸出結果:
請輸入一個數字,系統將判斷此數是否為質數:122483
質因數分解:53* 2311* 1
122483不是一個質數。它的質因數有[1, 53, 2311]
請輸入一個數字,系統將判斷此數是否為質數:174799
寫法僅供參考,畢竟Java才學了半年左右吧 >”<
(大家記得註解和程式碼要自己重新打過唷,工讀生會檢查;比方說將for迴圈改成while,while改成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;
}
}
}
沒有留言:
張貼留言
歡迎提供良性建議^_^