再練習這一篇之前,為了讓使用者一直輸入數字,所以我自己寫了一個無限迴圈,但9/13回來看,原來無限迴圈可以用這樣就好 while(true)
Q:請寫出一個判斷使用者輸入的數字,是否為2、3、6的倍數,若都不是也請顯示出非倍數。
A:除了符合條件上所說的,另外還加了迴圈,讓使用者可以一直輸入新的數字不用重跑程式
import java.util.Scanner; public class MainClass { public static void main(String[] args) { java.util.Scanner scanner = new java.util.Scanner(System.in); int userNum = 0; int p = 0; while(p==0){ System.out.print("請輸入數字:"); userNum = scanner.nextInt(); if (userNum % 6 == 0) { System.out.println("為2、3、6的倍數"); } else { if (userNum % 2 == 0) { System.out.println("為2的倍數"); } else { if (userNum % 3 == 0) { System.out.println("為3的倍數"); } else { System.out.println("不為2、3、6的倍數"); } } } } } }
Q:請寫出計算閏年的程式(判斷標準:每四年為閏,遇百年整數不閏,但400年閏)
A:與上題一樣的概念,只是換除數
import java.util.Scanner; public class MainClass { public static void main(String[] args) { java.util.Scanner scanner = new java.util.Scanner(System.in); int userMon = 0; int p = 0; while(p==0){ System.out.print("請輸入年分:"); userMon = scanner.nextInt(); if(userMon % 400==0){ System.out.println("是閏年"); }else if (userMon % 100 == 0) { System.out.println("不是閏年"); } else { if (userMon % 4 == 0) { System.out.println("是閏年"); }else{ System.out.println("不是閏年"); } } } } }
Q:請寫出計算BMI的程式(判斷標準: BMI = 體重(公斤) / 身高2(公尺2) ,超過24時顯示過重)
A:除了題目需要的,另外加上了顯示bmi值和過輕的判斷
import java.util.Scanner; public class MainClass { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double w,h,b; int p = 0; while(p==0){ System.out.print("請輸入體重(公斤):"); w = scanner.nextDouble(); System.out.print("請輸入身高(公分):"); h = scanner.nextDouble()/100; b = w/((h*h)); if(b>24){ System.out.printf("過重,BMI值:"+"%.2f",b); System.out.println(); }else if(b<18.5){ System.out.printf("過輕,BMI值:"+"%.2f",b); System.out.println(); }else { System.out.printf("正常,BMI值:"+"%.2f",b); System.out.println(); } } } }
Q:請列出1~10000的質數
A:這題難到我了QQ,我第一時間想不到怎麼解,於是上網查判斷質數的方式(當然不是直接看別人的code)
第一個思維:是質數的話,只會有兩個因數
import java.util.Scanner; public class MainClass { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int x; int y; int factorNum = 0; //因數數量 for(x = 1; x<10001; x++) { for(y = 1; y<10001; y++) //x除以1~10000 { if(x % y == 0){ //若餘數為0,就增加因數數量 factorNum++; } } if(factorNum == 2){ //若因數數量為2,就是質數,印出來 System.out.println(x); } factorNum = 0; //將因數數量歸0,換下一個數字X } } }
再找了一下資料,和參考課本裡的解答,重新整理
第二個思維:是質數的話,讓2~10000的數字去除以他們自身一半的數,逐一檢查是不是質數
為什麼用小於等於自己的一半的數呢?=> 假如有一個數x,x的因數,除了本身以外,不可能超過x/2
public class MainClass { public static void main(String[] args) { for(int x = 2; x<10001; x++){ boolean prime = true; //讓每個迴圈開始時重置布林值 for(int y = 2; y<=(x/2); y++){ if(x%y==0){ prime = false; //若整除,此數就不是質數 break; //不是質數後就不用往下繼續除了 } } if(prime) System.out.println(x + "是質數"); //如果布林是true就印出 } } }
第三個思維:
還有查到一種做法:
每一個數逐一除以一個2~本身-1的數
public class MainClass { public static void main(String[] args) { int i,j; for(i = 1; i<=10000; i++){ for(j = 2; j<i; j++){ //從2開始除 if(i%j==0) break; //如果整除就跳出迴圈 } if(j>=i) System.out.println(j); //如果離開第二個迴圈時,j的值>=i,代表此數的因數只有自身和1 } } }
這一個解法有一些地方似乎可以再修正得更好,讓自己更能理解一些
修正後(加底色):
public class MainClass { public static void main(String[] args) { int i,j; for(i = 1; i<=10000; i++){ for(j = 2; j<i; j++){ if(i%j==0) break; } if(j==i) System.out.println(i); //離開第二個迴圈時,j的數字如果等於i,代表此數的因數只有自身和1,所以印出i(是用i去逐一檢查的) } } }
第一個思維和第二個思維就差在,「判斷因數數量是否為2」這件事可以換成用「只要一碰到除以自身一半的數有整除 就不是質數」的布林質true或false來判斷,不用再多宣告一個變數放因數數量
為什麼第三個思維不能只除以到除數的一半就好呢?
=>
當迴圈逐一判斷到被除數的一半,跳出迴圈,沒有一個布林值來告訴程式,此數是否為質數。
若是用 if(j>=i) System.out.println(j) 的話,只判斷到被除數一半,不可能有j>i的狀況,j=i的狀況也只有2
那 j<i 就更不可能了,這句的意思是只要除數小於被除數,就印出來,這樣2~10000的數都會被印出來啊!
另外有一種演算法:
以下是書本裡的解答:
書本裡的解法是:讓3~10000的數去除以小於等於自己的一半的數,如果有整除的,代表此數非質數
import java.util.Scanner; public class MainClass { public static void main(String[] args) { boolean prime; for(int value = 3; value<=10000; value++){ prime=true; for(int i = 2; i<=value/2; i++){ if((value%i)==0){ prime=false; } if(prime==false) break; } if (prime) System.out.println(value + "是質數"); } } }
留言列表