再練習這一篇之前,為了讓使用者一直輸入數字,所以我自己寫了一個無限迴圈,但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("236的倍數");
            } else {
                if (userNum % 2 == 0) {
                    System.out.println("2的倍數");
                } else {
                    if (userNum % 3 == 0) {
                        System.out.println("3的倍數");
                    } else {
                            System.out.println("不為236的倍數");
                        }
                    }
                }
            }
        }
}

image

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("不是閏年");
                }
            }
        }
    }
}

image

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就印出
        }
    }
}

 

第三個思維

還有查到一種做法:

來源:JAVA-輸出1–100之內的所有質數

每一個數逐一除以一個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 + "是質數");
        }
    }
}

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Lillian 的頭像
    Lillian

    安安的code日記

    Lillian 發表在 痞客邦 留言(0) 人氣()