這次的功課老師出了兩個,第二個就是要做質因數分解,要先檢查該數是否為質數,如果是質數就直接顯示說是質數即可,若不是則必須顯示它有哪些質因數。
其實在實作上,我用的是比較簡單的方法,當然可以有人挑戰一下比較難的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; } } }
沒有留言:
張貼留言
歡迎提供良性建議^_^