Java برنامج للتحقق من الأعداد الأولية مع مثال

⚡ ملخص ذكي

Java يُوضح برنامج التحقق من الأعداد الأولية كيفية اختبار قابلية قسمة عدد صحيح واحد وتصنيفه كعدد أولي أو مركب. تتناول هذه المقالة التعريف الرياضي، ومنطق الحلقات، وشفرة برمجية كاملة قابلة للتنفيذ، وتحسين الجذر التربيعي، ومقارنة التعقيد، والأخطاء الشائعة لدى المبتدئين.

  • 🔢 قاعدة التعريف: العدد الأولي هو عدد طبيعي أكبر من 1 وله قاسمين فقط، وهما 1 والعدد نفسه.
  • 🔁 منطق الحلقة: اقسم المرشح على كل عدد صحيح من 2 إلى نصف العدد وسجل ما إذا كان أي باقي يساوي صفرًا.
  • 🚩 نمط العلم: يقوم متغير منطقي بتخزين النتيجة، وتخرج عبارة break من الحلقة في اللحظة التي يتم فيها العثور على قاسم.
  • √ تحسين الجذر التربيعي: يؤدي اختبار القواسم حتى الجذر التربيعي فقط إلى تقليل عدد التكرارات من n/2 إلى √n دون تغيير النتيجة.
  • ⚠️ الحالات الحدية: الصفر والواحد والقيم السالبة ليست أعدادًا أولية أبدًا، بينما 2 هو العدد الأولي الزوجي الوحيد.
  • ⏱️ مقارنة التعقيد: تعمل الحلقة الأساسية في زمن O(n) وطريقة الجذر التربيعي في زمن O(√n).
  • 🧪 ممارسة التحقق: قم بإجراء اختبار باستخدام 1 و 2 و 9 و 17 و 97 للتأكد من كل شرط من شروط الحدود.

Java برنامج للتحقق من الرقم الأولي

ما هو الرقم الأولي؟

العدد الأولي هو عدد طبيعي أكبر من 1 لا يقبل القسمة إلا على 1 أو على نفسه. على سبيل المثال، 11 لا يقبل القسمة إلا على 1 أو على نفسه. ومن الأعداد الأولية الأخرى: 2، 3، 5، 7، 11، 13، 17، وتستمر هذه السلسلة بلا نهاية.

يُطلق على العدد الأكبر من 1 وغير الأولي اسم العدد المركب، لأنه يمكن تكوينه من عوامل أصغر. فالعدد 9 مركب لأنه يقبل القسمة على 3، والعدد 15 مركب لأنه يقبل القسمة على 3 و5.

ملاحظة: 0 و1 ليسا عددين أوليين. 2 هو العدد الأولي الزوجي الوحيد، والقيم السالبة لا تُعتبر أعدادًا أولية أبدًا.

كيفية التحقق مما إذا كان العدد أوليًا في Java

تعتمد استراتيجية التحقق على اختبار قابلية القسمة المباشر. خذ القيمة المرشحة، واقسمها على كل عدد صحيح أصغر منها تباعًا، ثم افحص الباقي الناتج عن عملية القسمة. إذا كان الباقي صفرًا، فهذا يثبت وجود قاسم، مما يستبعد العدد فورًا.

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

  • نحتاج إلى قسمة عدد مُدخل، ولنقل 17، على القيم من 2 إلى 17 والتحقق من الباقي. إذا كان الباقي 0، فإن العدد ليس عددًا أوليًا.
  • لا يوجد رقم يقبل القسمة على أكثر من نصف نفسه. لذلك نحن بحاجة إلى حلقة من خلال فقط numberToCheck/2إذا كان المدخل هو 17، فإن النصف هو 8.5 وستتكرر الحلقة من خلال القيم من 2 إلى 8.
  • إذا كان العدد المراد فحصه قابلاً للقسمة تمامًا على عدد آخر، فسيتم تعيين علامة isPrime إلى false ويتم الخروج من الحلقة.

أنظمة Java تُشكّل الميزات أساس الخوارزمية بأكملها. عامل القسمة % تُعيد باقي قسمة عدد صحيح، و break تتوقف العبارة بمجرد معرفة الإجابة، لذلك لا يتم تنفيذ أي تكرارات غير ضرورية.

Java برنامج للتحقق مما إذا كان العدد أوليًا أم لا

يُسند البرنامج أدناه القيمة 17 إلى المتغير numberToCheck ويطبع كل خطوة من خطوات القسمة، مما يُتيح لك متابعة عملية الحساب سطرًا بسطر. يمكنك تعديل الكود، لذا غيّر القيمة وشغّله مرة أخرى باستخدام عدد غير أولي مثل 21 لرؤية النتيجة المعاكسة.

public class PrimenumberToCheckCheck {

 public static void main(String[] args) {
  int remainder;
  boolean isPrime=true;
  int numberToCheck=17; // Enter the number you want to check for prime

  //Loop to check whether the number is divisible by any number other than 1 and itself
  for(int i=2;i<=numberToCheck/2;i++)
  {
   //number is divided by i
            remainder=numberToCheck%i;
            System.out.println(numberToCheck+" Divided by "+ i + " gives a remainder "+remainder);

       //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
     if(remainder==0)
     {
        isPrime=false;
        break;
     }
  }
  // Check value true or false, if isPrime is true then the number is prime otherwise not prime
  if(isPrime)
     System.out.println(numberToCheck + " is a Prime number");
  else
     System.out.println(numberToCheck + " is not a Prime number");
    }
  }

الناتج المتوقع:

17 Divided by 2 gives a remainder 1
17 Divided by 3 gives a remainder 2
17 Divided by 4 gives a remainder 1
17 Divided by 5 gives a remainder 2
17 Divided by 6 gives a remainder 5
17 Divided by 7 gives a remainder 3
17 Divided by 8 gives a remainder 1
17 is a Prime number

تتوقف الحلقة عند 8 لأن 17 مقسومة على 2 تساوي 8 في حساب الأعداد الصحيحة. وبما أنه لم يكن هناك أي باقي قسمة يساوي صفرًا، فإن المتغير isPrime يحتفظ بقيمته الابتدائية true، ويطبع الشرط النهائي النتيجة الموجبة.

التحقق الأمثل من الأعداد الأولية باستخدام طريقة الجذر التربيعي

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

public class PrimeCheckOptimized {

    public static boolean isPrime(int n) {
        // 0, 1 and negative values are never prime
        if (n <= 1) {
            return false;
        }
        // 2 is the only even prime number
        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;
    }

    public static void main(String[] args) {
        int[] samples = {1, 2, 9, 17, 97};
        for (int value : samples) {
            System.out.println(value + " is prime: " + isPrime(value));
        }
    }
}

الإخراج:

1 is prime: false
2 is prime: true
9 is prime: false
17 is prime: true
97 is prime: true

الحالة i * i <= n يتجنب هذا الأسلوب استدعاء دالة Math.sqrt لحساب الجذر التربيعي، وتتخطى الخطوة 2 جميع القواسم الزوجية. بالنسبة لقيمة مثل 1,000,003، تُجري الحلقة الأساسية حوالي 500,000 تكرار، بينما يُجري هذا الإصدار أقل من 500 تكرار.

تحقق من عدد أولي أدخله المستخدم

يُعدّ إدخال البيانات المُبرمجة مسبقًا مناسبًا للعروض التوضيحية، إلا أن التمارين الحقيقية تتطلب عادةً إدخال البيانات عبر لوحة المفاتيح. تقرأ فئة Scanner عددًا صحيحًا من وحدة التحكم وتمرره إلى نفس دالة isPrime.

import java.util.Scanner;

public class PrimeCheckUserInput {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a number: ");
        int number = sc.nextInt();

        boolean isPrime = number > 1;
        for (int i = 2; i * i <= number; i++) {
            if (number % i == 0) {
                isPrime = false;
                break;
            }
        }

        System.out.println(number + (isPrime ? " is a Prime number" : " is not a Prime number"));
        sc.close();
    }
}

تشغيل تجريبي:

Enter a number: 29
29 is a Prime number

💡 نصيحة: تهيئة العلم باستخدام number > 1 يتعامل مع القيم 0 و 1 وكل مدخلات سالبة في تعبير واحد، مما يلغي الحاجة إلى شرط حماية منفصل.

أخطاء شائعة عند كتابة برنامج للأعداد الأولية

تفشل معظم عمليات الإدخال غير الصحيحة عند قيم الحدود وليس عند الحلقة الرئيسية. تتضمن القائمة أدناه الأخطاء الأكثر شيوعًا في برامج المبتدئين.

  1. بدء الحلقة من 1: كل عدد صحيح يقسم على 1، لذلك يتم تعيين العلم إلى خطأ على الفور ويبلغ البرنامج أنه لا يوجد عدد أولي.
  2. اعتبار العدد 1 عددًا أوليًا: القيمة 1 لها قاسم واحد فقط، لذا فهي تفشل في تعريف القاسمين ويجب أن تُرجع خطأ.
  3. حذف عبارة الاستراحة: لا يزال البرنامج يعيد الإجابة الصحيحة، لكنه يستمر في التكرار بعد معرفة النتيجة، مما يهدر الوقت على المدخلات الكبيرة.
  4. باستخدام i <= n كقيد: العدد يقسم نفسه دائمًا، لذلك يجب أن تتوقف الحلقة قبل الوصول إلى n.
  5. بالمقارنة مع = بدلا من ==: علامة المساواة المفردة تُسند قيمة بدلاً من اختبارها، مما ينتج عنه خطأ في وقت الترجمة في شرط if.

مقارنة طرق التحقق من الأعداد الأولية

اختر الطريقة التي تتناسب مع حجم المدخلات وما إذا كان يجب اختبار قيمة واحدة أو نطاق كامل.

الأسلوب تم اختبار نطاق المقسوم عليه تعقيد الوقت أفضل مناسب لـ
حلقة أساسية 2 إلى ن-1 O (ن) تعلم المنطق الأساسي
نصف القسم 2 إلى ن/2 O (ن) مدخلات صغيرة، رمز بسيط
طريقة الجذر التربيعي من 2 إلى √ن O(√n) قيم كبيرة مفردة
منخل إراتوستينس جدول مُعدّ مسبقًا O(n log log n) سرد جميع الأعداد الأولية في نطاق معين

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

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

لا. العدد 1 له قاسم واحد فقط، لذا فهو لا ينطبق عليه تعريف القاسمين. أي برنامج صحيح يجب أن يُرجع القيمة "خطأ" للعدد 1، وللعدد 0، ولكل عدد صحيح سالب.

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

نعم. غيّر نوع المعامل من int إلى long مع الحفاظ على نفس المنطق. بالنسبة للقيم التي تتجاوز 64 بت، استخدم BigInteger ودالة isProbablePrime الخاصة به بدلاً من القسمة التجريبية.

نعم. قم بتعريف العداد قبل الحلقة، وضع الشرط نفسه في رأس حلقة while، ثم قم بزيادة العداد داخل جسم الحلقة. سيبقى الناتج كما هو.

عادةً نعم، مع أن الكود المُولّد غالباً ما يُهمل التحقق من القيم 0 و1 والمدخلات السالبة. يُنصح دائماً بإجراء اختبارات الحدود بنفسك قبل قبول أي تطبيق مكتوب بواسطة الذكاء الاصطناعي.

تُشكّل الأعداد الأولية أساس وظائف التجزئة، وتوليد الأرقام العشوائية، وتشفير RSA الذي يحمي واجهات برمجة التطبيقات النموذجية ومجموعات البيانات المخزنة. وغالبًا ما يتم اختيار أحجام جداول التجزئة على أنها أعداد أولية لتوزيع المفاتيح بالتساوي.

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