Java โปรแกรมสำหรับพิมพ์ Prime Numbers จาก 1 ไป 100

⚡ สรุปอย่างชาญฉลาด

โปรแกรมพิมพ์เลขเฉพาะตั้งแต่ 1 ถึง 100 นิ้ว Java โปรแกรมจะสแกนทุกค่าในช่วงที่กำหนดและรายงานเฉพาะค่าที่มีตัวหารสองตัวพอดี บทความนี้อธิบายถึงคำจำกัดความ วิธีการตรวจสอบ โปรแกรมฉบับสมบูรณ์ ตะแกรงของเอราโตสเธเนส และการเปรียบเทียบประสิทธิภาพพร้อมผลลัพธ์ที่ได้รับการตรวจสอบแล้ว

  • 🔢 กฎการกำหนดนิยาม: จำนวนเฉพาะคือจำนวนที่มากกว่า 1 และหารลงตัวได้เฉพาะด้วย 1 และตัวมันเองเท่านั้น ซึ่งหมายความว่าไม่รวม 0 และ 1 เลย
  • 🔁 การสแกนระยะ: ลูปภายนอกจะวนซ้ำตั้งแต่ 2 ไปจนถึงขีดจำกัดบน และส่งต่อค่าแต่ละค่าไปยังวิธีการตรวจสอบที่สามารถนำกลับมาใช้ใหม่ได้
  • วิธีการบูลีน: CheckPrime จะคืนค่า false เมื่อพบตัวหารตัวแรก และคืนค่า true เมื่อลูปทำงานเสร็จสิ้นโดยไม่พบตัวหารที่ตรงกัน
  • ขอบเขตตัวหาร: การทดสอบจนถึงครึ่งหนึ่งของค่าถือว่าถูกต้อง และหยุดping การใช้รากที่สองให้คำตอบเดียวกันได้เร็วกว่ามาก
  • 🧮 ชุดผลลัพธ์: มีจำนวนเฉพาะอยู่ 25 จำนวนระหว่าง 1 ถึง 100 โดยจำนวนเฉพาะสุดท้ายคือ 97
  • วิธีการร่อน: ตะแกรงของเอราโตสเธเนสใช้สำหรับทำเครื่องหมายตัวคูณในอาร์เรย์บูลีน และทำงานในเวลา O(n log log n)
  • 🧪 แนวทางการตรวจสอบ: ตรวจสอบให้แน่ใจว่าได้รวม 2 ไว้แล้ว และได้ยกเว้น 1 ออกไป ก่อนที่จะเชื่อถือการใช้งานใดๆ

สำคัญ Numbers 1 ถึง 100 ใน Java

หมายเลขเฉพาะคืออะไร?

A จำนวนเฉพาะ จำนวนเฉพาะ คือจำนวนที่หารลงตัวได้เฉพาะด้วยหนึ่งหรือตัวมันเองเท่านั้น เป็นจำนวนธรรมชาติที่มากกว่าหนึ่งซึ่งไม่ใช่ผลคูณของจำนวนธรรมชาติที่เล็กกว่าสองจำนวน ตัวอย่างเช่น 11 หารลงตัวได้เฉพาะด้วยหนึ่งหรือตัวมันเองเท่านั้น จำนวนเฉพาะอื่นๆ ได้แก่ 2, 3, 5, 7, 11, 13, 17 และอื่นๆ

หมายเหตุ 0 และ 1 ไม่ใช่จำนวนเฉพาะ 2 เป็นจำนวนเฉพาะคู่เพียงตัวเดียว

ระหว่าง 1 ถึง 100 มีจำนวนเฉพาะอยู่ 25 จำนวนพอดี ตารางด้านล่างจัดกลุ่มจำนวนเฉพาะเหล่านี้ตามทศวรรษ ซึ่งทำให้เห็นรูปแบบการลดจำนวนลงเมื่อค่าเพิ่มขึ้น

พิสัย สำคัญ Numbers นับ
1 - 20 2, 3, 5, 7, 11, 13, 17, 19 8
21 - 40 23, 29, 31, 37 4
41 - 60 41, 43, 47, 53, 59 5
61 - 80 61, 67, 71, 73, 79 5
81 - 100 83, 89, 97 3

วิธีการพิมพ์ Prime Numbers ระหว่าง 1 ถึง 100 โปรแกรมใน Java

ด้านล่างนี้คือ Java โปรแกรมพิมพ์เลขเฉพาะตั้งแต่ 1 ถึง 100:

ตรรกะของโปรแกรม:

  • วิธีการหลักของ โปรแกรมเลขเฉพาะใน Java ประกอบด้วยลูปสำหรับตรวจสอบจำนวนเฉพาะระหว่าง 1 ถึง 100 ทีละตัว
  • วิธีการหลักเรียกวิธีการ CheckPrime เพื่อตรวจสอบว่าจำนวนใดเป็นจำนวนเฉพาะหรือไม่ Java หรือไม่
  • เราต้องนำตัวเลขที่ป้อนเข้ามา เช่น 17 มาหารด้วยค่าตั้งแต่ 2 ถึง 17 แล้วตรวจสอบเศษเหลือ ถ้าเศษเหลือเป็น 0 แสดงว่าตัวเลขนั้นไม่ใช่จำนวนเฉพาะ
  • ไม่มีจำนวนใดหารลงตัวด้วยตัวมันเองเกินครึ่งหนึ่ง ดังนั้น เราจึงต้องวนลูปโดยใช้ค่า numberToCheck/2 เท่านั้น ถ้าค่าที่ป้อนเข้ามาคือ 17 ครึ่งหนึ่งคือ 8.5 และลูปจะวนซ้ำค่าตั้งแต่ 2 ถึง 8
  • If numberToCheck ถ้าจำนวนนั้นหารลงตัวด้วยจำนวนอื่น เราจะส่งค่า false กลับมา และลูปจะหยุดทำงาน
  • If numberToCheck เป็นจำนวนเฉพาะ เรากลับเป็นจริง
  • ในวิธีหลักสำหรับจำนวนเฉพาะ 1 ถึง 100 ใน Javaตรวจสอบว่า isPrime เป็นจำนวนเฉพาะหรือไม่ TRUE และเพิ่มค่าดังกล่าวให้กับจำนวนเฉพาะNumbersพบสตริง
  • สุดท้ายพิมพ์จำนวนเฉพาะจาก 1 ถึง 100 ใน Java.

การแยกการตรวจสอบออกเป็นเมธอดเฉพาะทำให้โปรแกรมสามารถนำกลับมาใช้ใหม่ได้ เมธอด CheckPrime เดียวกันนี้สามารถเรียกใช้ได้กับค่าขีดจำกัดบนใดๆ ก็ได้โดยการเปลี่ยนค่าตัวแปร maxCheck เท่านั้น

public class PrimeNumbers {

    public static void main(String[] args) {

        int i;
        int num = 0;
        int maxCheck = 100; // maxCheck limit till which you want to find prime numbers
        boolean isPrime = true;

        //Empty String
        String primeNumbersFound = "";

        //Start loop 2 to maxCheck
        for (i = 2; i <= maxCheck; i++) {
            isPrime = CheckPrime(i);
            if (isPrime) {
                primeNumbersFound = primeNumbersFound + i + " ";
            }
        }
        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        // Print prime numbers from 1 to maxCheck
        System.out.println(primeNumbersFound);
    }
    public static boolean CheckPrime(int numberToCheck) {
        int remainder;
        for (int i = 2; i <= numberToCheck / 2; i++) {
            remainder = numberToCheck % i;
            //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
            if (remainder == 0) {
                return false;
            }
        }
        return true;

    }

}

ผลลัพธ์ที่คาดหวัง:

ผลลัพธ์ของจำนวนเฉพาะระหว่าง 1 ถึง 100 ใน Java โครงการ จะ:

Prime numbers from 1 to 100 are:
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

ค่า 2 ผ่านเนื่องจากเงื่อนไขของลูปภายใน i <= 2 / 2 ประเมินถึง 2 <= 1ซึ่งเป็นเท็จทันที ดังนั้นเมธอดจึงคืนค่าเป็นจริงโดยไม่ต้องหารแม้แต่ครั้งเดียว

เวอร์ชันที่ปรับให้เหมาะสมโดยใช้ขอบเขตรากที่สอง

การหารด้วยจำนวนไม่เกินครึ่งหนึ่งนั้นถูกต้อง แต่เป็นการทำงานที่ไม่จำเป็น ตัวหารมักปรากฏเป็นคู่ๆ รอบรากที่สอง ดังนั้นตัวประกอบใดๆ ที่มากกว่า √n จะมีคู่ของมันที่น้อยกว่า ซึ่งได้ถูกทดสอบไปแล้ว

public class PrimeNumbersOptimized {

    public static void main(String[] args) {
        int maxCheck = 100;
        int count = 0;
        StringBuilder result = new StringBuilder();

        for (int i = 2; i <= maxCheck; i++) {
            if (isPrime(i)) {
                result.append(i).append(" ");
                count++;
            }
        }

        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        System.out.println(result.toString().trim());
        System.out.println("Total primes found: " + count);
    }

    public static boolean isPrime(int n) {
        if (n <= 1) return false;
        if (n == 2) return true;
        if (n % 2 == 0) return false;

        // test only odd divisors up to the square root
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0) return false;
        }
        return true;
    }
}

Output:

Prime numbers from 1 to 100 are:
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
Total primes found: 25

💡 เคล็ดลับ: StringBuilder จะแทนที่การต่อสตริงซ้ำๆ ภายในลูป แต่ละ += การเรียกใช้เมธอด on a String จะสร้างอ็อบเจ็กต์ใหม่ ซึ่งจะสามารถวัดค่าได้เมื่อค่าสูงสุดถึงหลายพัน

พิมพ์ไพรม์ Numbers การใช้ตะแกรงของเอราโตสเธเนส

เมื่อต้องการจำนวนเฉพาะทุกตัวในช่วงที่กำหนด การหารแบบลองผิดลองถูกไม่ใช่เครื่องมือที่เหมาะสม ตะแกรงของเอราโตสเธเนสสร้างอาร์เรย์แบบบูลีน ทำเครื่องหมายตัวคูณของจำนวนเฉพาะแต่ละตัวว่าเป็นจำนวนประกอบ และอ่านค่าส่วนที่เหลือที่ไม่ได้ทำเครื่องหมาย

วิธีการนี้ดำเนินการในสามขั้นตอน:

  1. สร้างอาร์เรย์บูลีนขนาด n+1 และสมมติว่าดัชนีทุกตัวตั้งแต่ 2 ขึ้นไปเป็นจำนวนเฉพาะ
  2. เริ่มตั้งแต่เลข 2 เป็นต้นไป ให้ทำเครื่องหมายทุกจำนวนที่เป็นผลคูณของจำนวนเฉพาะปัจจุบันว่าเป็นจำนวนประกอบ
  3. เลื่อนไปยังดัชนีที่ยังไม่ได้ทำเครื่องหมายถัดไป และทำซ้ำจนกว่าจะผ่านรากที่สองของ n
import java.util.Arrays;

public class SieveOfEratosthenes {

    public static void main(String[] args) {
        int n = 100;
        boolean[] composite = new boolean[n + 1];

        for (int p = 2; p * p <= n; p++) {
            if (!composite[p]) {
                // start at p*p because smaller multiples are already marked
                for (int multiple = p * p; multiple <= n; multiple += p) {
                    composite[multiple] = true;
                }
            }
        }

        StringBuilder result = new StringBuilder();
        for (int i = 2; i <= n; i++) {
            if (!composite[i]) {
                result.append(i).append(" ");
            }
        }

        System.out.println("Prime numbers from 1 to " + n + " are:");
        System.out.println(result.toString().trim());
    }
}

Output:

Prime numbers from 1 to 100 are:
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 ค่า ดังนั้นการเลือกใช้จึงขึ้นอยู่กับขนาดของช่วงข้อมูลเป็นหลัก

เข้าใกล้ ความซับซ้อนของเวลา หน่วยความจำเสริม ช่วงที่ดีที่สุด
การหารทดลองเป็น n/2 โอ(n²) O (1) มากถึงหลายพัน
การหารทดลองเป็น √n โอ(n√n) O (1) มากถึงหลายแสน
ตะแกรงเอราทอสเธเนส O(n log log n) O (n) คุณค่านับล้าน

ตรวจสอบโปรแกรมของเราเพื่อค้นหา จำนวนเฉพาะจากจำนวนป้อนใดๆ เมื่อต้องการทดสอบค่าเดียวแทนที่จะเป็นช่วงค่า สำหรับแบบฝึกหัดเพิ่มเติมเกี่ยวกับการวนซ้ำ โปรดดูที่ ลำดับฟิโบนาชี่ใน Javaที่ Java โปรแกรมพาลินโดรมและ Bubble เรียงลำดับอัลกอริทึมใน Javaอาร์เรย์บูลีนที่ใช้โดยตัวกรองจะได้รับการอธิบายเพิ่มเติมในหัวข้อถัดไป Java อาร์เรย์.

คำถามที่พบบ่อย

มีจำนวนทั้งหมด 25 ตัว ลำดับเริ่มต้นที่ 2 และสิ้นสุดที่ 97 โดยความหนาแน่นจะลดลงเรื่อยๆ เมื่อค่าเพิ่มมากขึ้น

เงื่อนไขของลูปภายในกลายเป็น 2 <= 1 ซึ่งเป็นเท็จทันที ดังนั้นจึงไม่มีการหารเกิดขึ้น และเมธอดจะส่งคืนค่าจริง กรณีเดียวนี้คุ้มค่าที่จะทดสอบในทุกการใช้งาน

เปลี่ยนค่าตัวแปร maxCheck เป็น 500 หากต้องการเริ่มต้นที่ค่ามากกว่า 1 ให้ปรับค่าเริ่มต้นของตัวนับลูปภายนอกแทน และอย่าแก้ไขวิธีการตรวจสอบ

จำนวนทวีคูณที่เล็กกว่าของ p ทุกตัวจะมีตัวประกอบเฉพาะที่เล็กกว่าอยู่แล้ว และถูกทำเครื่องหมายไว้ในขั้นตอนก่อนหน้านี้ การเริ่มต้นที่ p กำลังสองจะช่วยหลีกเลี่ยงการทำงานซ้ำซ้อนนั้น

โดยทั่วไปแล้ว ระบบจะแสดงผลการหารทดลอง เว้นแต่ว่าคำสั่งจะระบุช่วงหรือประสิทธิภาพที่กว้างมาก การระบุขีดจำกัดบนในคำขอโดยปกติแล้วจะทำให้ได้ผลลัพธ์เป็นการกรองแทน

จำนวนเฉพาะถูกเลือกใช้เป็นขนาดของตารางแฮชและบัคเก็ตคุณลักษณะ เนื่องจากจำนวนเฉพาะกระจายคีย์อย่างสม่ำเสมอและลดการชนกัน นอกจากนี้ยังใช้เป็นค่าเริ่มต้นของฟังก์ชันแฮชที่ใช้ในการแปลงคุณลักษณะเป็นเวกเตอร์อีกด้วย

สรุปโพสต์นี้ด้วย: