1. حل الرقم الرئيسي
1.1 الوصف
بادئ ذي بدء ، دعونا نفهم المفهوم ، وهو ما هو الأرقام الرئيسية؟ الرقم الرئيسي: إذا كان لا يمكن تقسيم الرقم إلا على 1 ، ويسمى هذا الرقم رقمًا رئيسيًا ، ويسمى الرقم المقابل رقمًا للمجموع. استنادًا إلى هذا المفهوم ، يمكننا أن نفكر بسرعة في طريقة ما ، والتي تتمثل في البدء من 1 واختبار باستمرار لمعرفة ما إذا كانت هناك أرقام يمكن تقسيمها من 1 إلى نفسها.
من وجهة النظر هذه ، من السهل جدًا العثور على أعداد أولية. هل هناك طريقة أكثر ملاءمة بالنسبة لنا؟ فيما يلي طريقة شهيرة لإيجاد أعداد رئيسية من قبل إراتوستينيس.
1.2 الحل
بادئ ذي بدء ، يمكنك استخدام الدوائر لحل هذه المشكلة. قسّم الرقم المحدد بجميع الأرقام أصغر منه. إذا كان بإمكانك تقسيمه ، فهو ليس رقمًا رئيسيًا. ومع ذلك ، كيفية تقليل عدد عمليات فحص الدوائر؟ كيف تجد جميع الأرقام الأولية أصغر من n؟
على افتراض أن الرقم الذي سيتم فحصه هو N ، في الواقع ، فقط تحقق من رقم جذر N. والسبب بسيط للغاية. افترض أن A*B = N ، إذا كان A أكبر من رقم جذر N ، في الواقع ، تحقق قبل أن يكون أقل من A يمكن أولاً التحقق من أن الرقم B يمكن تقسيمه. ومع ذلك ، فإن استخدام رقم الجذر في البرنامج سيكون له مشكلة الدقة ، بحيث يمكنك استخدام i*i <= n للتحقق وسيكون التنفيذ أسرع.
لنفترض أن هناك غربال لتخزين 1 ~ n ، على سبيل المثال:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 .........
أول شخص ينعش مضاعفات 2:
2 3 5 7 9 11 13 15 17 19 21 ......... N
ثم نخل مضاعفات 3:
2 3 5 7 11 13 17 19 ......... N
ثم غربلة مضاعفات 5 ، ثم غربلة العدد الرئيسي من 7 ، ثم غربلة مضاعفات 11 ... ، وبهذه الطريقة ، الأرقام المتبقية في النهاية كلها أعداد أولية ، هذه هي طريقة فحص eratosthenes (eratosthenessioniveMethod).
يمكن تقليل عدد الشيكات. في الواقع ، ما عليك سوى التحقق من 6N+1 و 6N+5 ، أي تخطي مضاعفات 2 و 3 مباشرة ، بحيث يمكن تقليل إجراء التحقق في البرنامج.
1.3 رمز
استيراد java.util.*؛ PRICAL CLASS PRIME {public static int [] FindPremes (Final int max) {int [] prime = new int [max+1] ؛ قائمة ArrayList = new ArrayList () ؛ لـ (int i = 2 ؛ i <= max ؛ i ++) prime [i] = 1 ؛ لـ (int i = 2 ؛ i*i <= max ؛ i ++) {// يمكن تحسين هذا إذا (prime [i] == 1) {for (int j = 2*i ؛ j <= max ؛ j ++) {if (j ٪ i == 0) prime [j] = 0 ؛ }}} لـ (int i = 2 ؛ i <max ؛ i ++) {if (prime [i] == 1) {list.add (new integer (i)) ؛ }} int [] p = new int [list.size ()] ؛ Object [] objs = list.toarray () ؛ لـ (int i = 0 ؛ i <p.length ؛ i ++) {p [i] = ((integer) objs [i]). Intvalue () ؛ } إرجاع P ؛ } public static void main (string [] args) {int [] prime = prime.findprimes (1000) ؛ لـ (int i = 0 ؛ i <prime.length ؛ i ++) {system.out.print (prime [i]+"") ؛ } system.out.println () ؛ }}2. العوامل
2.1 الوصف
كما هو موضح أعلاه ، دعونا أولاً نفهم ما هو العوامل؟ يسمى تحويل رقم إلى منتج عدة أرقام أخرى. بعد فهم هذا المفهوم ، يجب أن نكون قادرين على فهم أننا نحل عامل رقم مجموع مقارنة مع الحل أعلاه لحل الرقم الرئيسي.
يستخدم العوامل أساسًا القيمة الأصغر من رقم الإدخال كقسم ، ويزيلها برقم الإدخال. إذا كان يمكن تقسيمها ، فسيتم اعتبارها عاملاً. الحل الأسرع هو العثور على جميع الأرقام الأولية أصغر من الرقم ومحاولة معرفة ما إذا كان يمكن تقسيمه.
2.2 رمز
استيراد java.util.arraylist ؛ عامل الطبقة العامة {factor int [] int [] int num) {int [] pnum = prime.findprimes (num) ؛ قائمة ArrayList = new ArrayList () ؛ لـ (int i = 0 ؛ pnum [i] * pnum [i] <= num ؛) {if (num ٪ pnum [i] == 0) {list.add (integer new (pnum [i])) ؛ num /= pnum [i] ؛ } آخر i ++ ؛ } list.add (عدد صحيح جديد (num)) ؛ int [] f = new int [list.size ()] ؛ Object [] objs = list.toarray () ؛ لـ (int i = 0 ؛ i <f.length ؛ i ++) {f [i] = (integer) objs [i]). Intvalue () ؛ } إرجاع f ؛ } public static void main (string [] args) {int [] f = factor.factor (100) ؛ لـ (int i = 0 ؛ i <f.length ؛ i ++) {system.out.print (f [i]+"") ؛ } system.out.println () ؛ }}3. ملخص
يعد حل الأعداد الأولية والعوامل هو المهارة الأساسية لبرامج التعلم والخوارزميات ، ويجب عليك إتقانها بشكل كفاءة. يحتوي الكود هنا على عدد صغير فقط من التعليقات ، والتي قد تكون صعبة بعض الشيء على المبتدئين ، ولكن هذه هي الخطوة الأولى لدخول خوارزميات قصر البرنامج. يمكنك نسخ هذا الرمز إلى جهازك وملء التعليقات خطوة بخطوة لجعل عملية البرنامج أكثر وضوحًا.
ما سبق هو كل محتوى هذه المقالة حول تطبيق برمجة Java لتحقيق الأرقام الأولية ورمز العوامل ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها!