Java求100以內的質數的四種方法


質數:

  • 又稱素數,只能被1和它本身整除的數就是質數。

難點:

  • 需要兩層循環,外層循環99遍;
  • 內層循環,控制除數為2到98(也就是2到被除數前面的一個數)。
  • 為什么從2開始?因為所有數都能被1整除。
  • 需要定義一個變量flag來記錄某個數是不是質數
  • 內層循環結束后需要重新把flag重置為true

方法一:

import org.junit.Test;

public class Demo {

    @Test
    public void primeNumberTest() {

        boolean flag = true;

        for (int i = 2; i <= 100; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                //為什么要定義變量flag?
                //因為只能被1和它本身整除的才是質數,而如果if的判斷條件為true
                //則這個數不是質數。因為進入if判斷條件,意味着這個數能被2到i-1的某個數整除
                    flag = false;
                }
            }
            if (flag) {
                System.out.print(i+",");
            }
        //因為內層循環會把flag的值設置為false
        //如果沒有下面的語句,flag的值在進入內層循環之后將永遠為false
            flag = true;
        }
    }
}

結果:

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,

 

方法二:

與方法一相比有所改進的地方,把flag放在外層與內層循環之間,這樣就不用每次結束內層循環后去重置flag的值。

import org.junit.Test;

public class Demo {

    @Test
    public void primeNumberTest() {

        for (int i = 2; i <= 100; i++) {
        //因為flag定義在外層循環與內層循環之間,所以每次開始外層循環時flag的值都是true
        //這樣就不需要在內層循環結束時重置flag的值為true了    
            boolean flag = true;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    //為什么要定義變量flag?
                    //因為只能被1和它本身整除的才是質數,而如果if的判斷條件為true
                    //則這個數不是質數。因為進入if判斷條件,意味着這個數能被2到i-1的某個數整除
                    flag = false;
                }
            }
            if (flag) {
                System.out.print(i + ",");
            }
        }
    }
}

結果

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,

 

方法三:

改進:在if判斷語句后面加了break,因為只要有能被2到i-1當中的一個數整除,這個i就不是質數,就沒有必要繼續循環下去
import org.junit.Test;

public class Demo {

    @Test
    public void primeNumberTest() {
        
        System.out.println(start);
        for (int i = 2; i <= 10000; i++) {
            boolean flag = true;
            for (int j = 2; j <i; j++) {
                if (i % j == 0) {
                    flag = false;
                    break;//這是改進的地方,因為只要有能被2到i-1當中的一個數整除,這個i就不是質數,就沒有必要繼續循環下去
                }
            }
            if (flag) {
                System.out.print(i+",");
            }

        }
    }
}

 

方法四:

改進:把j的取值范圍由<i,改為<=Math.sqrt(i)

import org.junit.Test;

public class Demo {

    @Test
    public void primeNumberTest() {

       
        for (int i = 2; i <= 100; i++) {
            boolean flag = true;
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.print(i + ",");
            }

        }
    }
}

 

方法四的小改進:

加了一個count,去統計質數的個數

import org.junit.Test;

public class Demo {

    @Test
    public void primeNumberTest() {

        int count=0;
        for (int i = 2; i <= 100; i++) {
            boolean flag = true;
            for (int j = 2; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.print(i + ",");
                count++;
            }
        }
        System.out.print("質數個數為:"+count);
    }
}

結果:

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,質數個數為:25

 

后記:

2020年3月3日 09:45AM 星期二 農歷2020年二月初十 上海 晴 溫度:12°,比較冷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM