Java برنامج للطباعة برايم 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 خمسة وعشرون عددًا أوليًا بالضبط. يصنف الجدول أدناه هذه الأعداد حسب العقد، مما يجعل نمط التناقص واضحًا مع ازدياد القيم.

المدى رئيسي Numbers العد التنازلي
٢٠٢٤/٢٠٢٣ 2، 3، 5، 7، 11، 13، 17، 19 8
٢٠٢٤/٢٠٢٣ 23 ، 29 ، 31 ، 37 4
٢٠٢٤/٢٠٢٣ 41، 43، 47، 53، 59 5
٢٠٢٤/٢٠٢٣ 61، 67، 71، 73، 79 5
٢٠٢٤/٢٠٢٣ 83، 89، 97 3

كيفية طباعة برايم Numbers بين 1 إلى 100 برنامج في Java

وفيما يلي Java برنامج لطباعة الأعداد الأولية من 1 إلى 100:

منطق البرنامج:

  • الطريقة الرئيسية لـ برنامج الأعداد الأولية في Java يحتوي على حلقة للتحقق من الأعداد الأولية بين 1 و 100 واحدًا تلو الآخر.
  • الطريقة الرئيسية تستدعي الطريقة CheckPrime لتحديد ما إذا كان العدد عددًا أوليًا في Java أم لا.
  • نحتاج إلى قسمة عدد مُدخل، ولنقل 17، على القيم من 2 إلى 17 والتحقق من الباقي. إذا كان الباقي 0، فإن العدد ليس عددًا أوليًا.
  • لا يوجد عدد يقبل القسمة على أكثر من نصفه. لذا، نحتاج إلى المرور على العدد المراد فحصه/2 فقط. إذا كان المدخل 17، فإن النصف هو 8.5، وستتكرر الحلقة على القيم من 2 إلى 8.
  • If numberToCheck إذا كان العدد قابلاً للقسمة تماماً على عدد آخر، فإننا نعيد القيمة false، وتتوقف الحلقة.
  • If numberToCheck هو أولي، نعود صحيحا.
  • في الطريقة الرئيسية للأعداد الأولية من 1 إلى 100 في Javaتحقق مما إذا كان العدد الأولي هو 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;
    }
}

الإخراج:

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());
    }
}

الإخراج:

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، لذا فإن الاختيار يعتمد كلياً على حجم النطاق.

النهج تعقيد الوقت ذاكرة إضافية نطاق
قسمة تجريبية إلى ن/2 س (ن²) يا (1) يصل إلى بضعة آلاف
القسمة التجريبية إلى √ن O(n√n) يا (1) يصل إلى بضع مئات الآلاف
منخل إراتوستينس O(n log log n) O (ن) ملايين القيم

اطلع على برنامجنا للعثور على الأعداد الأولية من أي رقم مُدخل عندما يكون من الضروري اختبار قيمة واحدة بدلاً من نطاق. لمزيد من التمارين التي تعتمد على الحلقات، راجع... متسلسلة فيبوناتشي Javaأطلقت حملة Java برنامج الكلمات المتناظرة، و Bubblه خوارزمية الفرز في Javaيتم شرح المصفوفة المنطقية المستخدمة بواسطة الغربال بمزيد من التفصيل في Java المصفوفات.

الأسئلة الشائعة

يوجد بالضبط 25. يبدأ التسلسل من 2 وينتهي عند 97، وتتناقص الكثافة باطراد مع ازدياد القيم.

يصبح شرط الحلقة الداخلية 2 <= 1، وهو شرط خاطئ فورًا، لذا لا يتم إجراء أي قسمة وتعيد الدالة القيمة true. من المهم اختبار هذه الحالة تحديدًا في كل تطبيق.

قم بتغيير قيمة المتغير maxCheck إلى 500. وللبدء بقيمة أعلى من 1، قم بتعديل القيمة الأولية لعداد الحلقة الخارجية بدلاً من ذلك، واترك طريقة الفحص دون تغيير.

كل مضاعف أصغر من p يحتوي بالفعل على عامل أولي أصغر، وقد تم تحديده في عملية سابقة. البدء من p تربيع يجنب تكرار هذا العمل.

عادةً ما تُعيد هذه البرامج عملية القسمة التجريبية ما لم يذكر الطلب نطاقًا أو أداءً واسعًا. تحديد الحد الأعلى في الطلب يُنتج عادةً الغربال بدلاً من ذلك.

يتم اختيار الأعداد الأولية كأحجام لجداول التجزئة ومجموعات الميزات لأنها توزع المفاتيح بالتساوي وتقلل من التصادمات. كما أنها تُستخدم لتهيئة دوال التجزئة المستخدمة في تحويل الميزات إلى متجهات.

تلخيص هذه التدوينة بـ: