برنامج الرقم المثالي في بايثون: كيف تتحقق مما إذا كان الرقم مثاليًا أم لا؟
نشرت: 2021-01-29مقدمة
يُقال أن الرقم هو الرقم المثالي إذا كان مجموع قواسمه الصحيحة (لا يشمل الرقم نفسه) مساويًا للرقم.
للحصول على فكرة أفضل ، دعنا نفكر في مثال ، القواسم المناسبة للعدد 6 هي 1 ، 2 ، 3. الآن مجموع هذه القواسم يساوي 6 (1 + 2 + 3 = 6) ، لذلك يُقال إن 6 عدد مثالي . بينما إذا أخذنا في الاعتبار عددًا آخر مثل 12 ، فإن القواسم الصحيحة لـ 12 هي 1 ، 2 ، 3 ، 4 ، 6. الآن مجموع هذه القواسم لا يساوي 12 ، لذا فإن 12 ليس عددًا كاملاً.
تعد البرمجة بلغات Python أبسط نسبيًا وأكثر متعة عند مقارنتها باللغات الأخرى بسبب تركيبها البسيط وقابليتها الجيدة للقراءة. الآن بعد أن أصبحنا واضحين مع مفهوم العدد المثالي ، دعنا نكتب برنامج بيثون للتحقق مما إذا كان الرقم رقمًا مثاليًا أم لا. لنقم ببناء كود Python للتحقق مما إذا كان إدخال المستخدم المحدد هو رقم مثالي أم لا واستكشاف المتعة في الترميز باستخدام Python. ألق نظرة على برامج علوم البيانات لدينا إذا كنت مهتمًا باكتساب الخبرة.
قراءة: برامج أنماط بايثون
جدول المحتويات
برنامج بايثون
الحل الأساسي لإيجاد رقم مثالي هو إجراء الحلقة من 2 إلى الرقم 1 ، والحفاظ على مجموع مقسوماته الصحيحة ، والتحقق مما إذا كان المجموع مساويًا للرقم.
n = int (input ("أدخل الرقم")) المجموع = 1 لأني في النطاق (2 ، ن): إذا (n٪ i == 0): المجموع = مجموع + أنا إذا (المجموع == ن): print (n ، "هو رقم مثالي") آخر: طباعة (ن ، "ليس رقمًا مثاليًا") |
دعنا نتصفح الكود.
نقوم أولاً بتهيئة n بإدخال المستخدم ونقوم بنسخه إلى عدد صحيح لأنه افتراضيًا تتم قراءة إدخال المستخدم كسلسلة في لغة python. نحتاج إلى التحقق مما إذا كان n عددًا كاملاً أم لا. لاحظ أننا نقوم بتهيئة المجموع بـ 1 لأن 1 هو قاسم مناسب لجميع الأعداد الصحيحة (باستثناء الصفر) ، بحيث يمكننا استبعاد التكرار في الحلقة والبدء مباشرة من 2.
نحن نحلل أكثر من 2 إلى رقم 1 ونضيف الأعداد الصحيحة لنجمعها إذا كان قاسمًا مناسبًا. وأخيرًا ، عندما نخرج من الحلقة ، نتحقق مما إذا كان المجموع الذي تم الحصول عليه يساوي الرقم أم لا. قطعة من الكعكة أليس كذلك؟
نسخة محسنة قليلا
بعد تجربة البرنامج أعلاه ، قد يكون لدينا سؤال ، هل يمكننا تحسينه؟ حسنًا ، لكن يمكننا تقليل عدد التكرارات إلى عدد / 2 دون تغيير الخوارزمية. لأننا توصلنا إلى فكرة أن الرقم لا يمكن أن يحتوي على مقسوم مناسب أكبر من الرقم / 2.
n = int (input ("أدخل الرقم")) المجموع = 1 بالنسبة لـ i في النطاق (2 ، n // 2 + 1): إذا (n٪ i == 0): المجموع = مجموع + أنا إذا (المجموع == ن): print (n ، "هو رقم مثالي") آخر: print (ن ، "ليس رقمًا مثاليًا") |
المقتطف أعلاه مشابه تقريبًا للمقتطف السابق ، مع الاختلاف الوحيد في التكرار حتى الرقم / 2. لاحظ أننا نجري قسمًا صحيحًا لتجنب تحويله إلى نوع عائم ، ونقوم بالتكرار حتى n // 2 + 1 لأن العدد الصحيح الأخير في النطاق لا يتم اعتباره في حلقة python.
محددات
عندما يُطلب منا إيجاد الأعداد المثالية في نطاق معين ، فإن حلنا سيستهلك الوقت المتناسب مع الرقم ^ 2 ، أي O (n²) تعقيد زمني. لأننا نحتاج إلى إجراء حلقة فوق كل رقم في النطاق المحدد ثم التحقق من وجود قواسم مناسبة لكل رقم. وعدد قليل يلبي شرط الرقم المثالي. على سبيل المثال ، عدد الأعداد المثالية في النطاق من 0 إلى 1000 هو 3 فقط (6 ، 28 ، 496).

يوجد حل مُحسَّن لهذا الأمر حيث لا نحتاج إلى إجراء حلقة فوق جميع العناصر للعثور على القواسم المناسبة ، تنص صيغة إقليدس على أن 2 ن −1 (2 ن - 1) عدد زوجي حيث يكون كلاهما n ، (2 ن - 1) الأعداد الأولية. على سبيل المثال ، 6 تحقق المعادلة أعلاه مع n كـ 2 وكلاهما 2 ، 2 2-1 (2 2-1 = 3) أعداد أولية. لكن لا يمكننا الإجابة عما إذا طُلب منا إيجاد ما إذا كان هناك أي أعداد كاملة فردية.
نحن نعلم أيضًا أن لكل لغة حدًا لنطاق الأعداد الصحيحة التي يمكنها تخزينها. مع هذا القيد ، قد لا يكون لدينا طريقة للعثور على أكبر عدد مثالي.
نواجه كل هذه القيود إذا كان رقم الإدخال كبيرًا ، ولكن إذا كان رقم الإدخال صغيرًا ، فإن حلنا الأولي سيعمل في وقت أقل.
اقرأ أيضًا: Python Framework for Web Development
خاتمة
لقد عرفنا التعريف وفهمنا المفهوم الكامن وراء الرقم المثالي. تمشي من خلال حل أساسي لإيجاد رقم هو رقم مثالي أم لا. وبعد مشاهدة الحل الأولي ، قمنا بتحسينه قليلاً عن طريق تقليل عدد التكرارات. لقد تجاوزنا قيود الخوارزمية الخاصة بنا وناقشنا صيغة إقليدس للعثور على العدد المثالي.
الآن بعد أن أصبحت على دراية ببرنامج Python للتحقق مما إذا كان الرقم هو رقم مثالي أم لا. حاول كتابة الكود بنفسك وحاول تحسينه إذا وجدت أي تكرارات متداخلة. حاول أيضًا إنشاء الكود لإيجاد الأعداد المثالية في نطاق الأرقام المحدد.
إذا كنت مهتمًا بمعرفة المزيد عن Python وعلوم البيانات ، فراجع برنامج IIIT-B & upGrad's Executive PG في علوم البيانات الذي تم إنشاؤه للمهنيين العاملين ويقدم أكثر من 10 دراسات حالة ومشاريع ، وورش عمل عملية عملية ، وإرشاد مع خبراء الصناعة ، وجهاً لوجه مع موجهين في الصناعة ، وأكثر من 400 ساعة من التعلم والمساعدة في العمل مع الشركات الكبرى.
اشرح تعقيدات برنامج الرقم المثالي في بايثون.
يُقال أن الرقم هو رقم مثالي إذا كان مساويًا لمجموع مقسوماته. للتحقق مما إذا كان الرقم مثاليًا أم لا ، لدينا طريقتان. النهج الأول هو نهج ساذج حيث يكون تعقيد الوقت هو O (n2) لأننا نكرر مرات "j" لكل حرف "i" ونتحقق من مقسوماتها.
الطريقة الثانية هي الحل الأمثل حيث يكون التعقيد الزمني هو O (√n). هنا لا نحتاج إلى تكرار كل رقم. يمكننا أن نستنتجها مباشرة باستخدام صيغة إقليدس وهي:
2n − 1 (2n - 1) ، حيث n و 2 n عددان أوليان.
ومع ذلك ، فإن هذه الصيغة لا تعمل مع الأعداد الفردية المثالية ، وبالتالي ، يتعين علينا إيجاد طريقة أخرى لها.
ما هي حدود مناهج برنامج الرقم المثالي؟
كل من هذه الأساليب جيدة ولكن إلى حد ما فقط. لا يمكن اعتبار أي منهما الطريقة المثالية بسبب بعض الجوانب الفنية. قيود هذه الأساليب هي كما يلي:
1. النهج الأول والساذج أسوأ لأنه يستهلك الكثير من الوقت والذاكرة وله تعقيد زمني لـ O (n2). هذا لأننا نستخدم حلقة متداخلة ونكرر الحلقة الداخلية n مرة لكل عنصر من الحلقة الخارجية. هذا النهج ساذج وسيعطي TLE لقيم أكبر لـ n وبالتالي لا يوصى به.
2. ثم لدينا نهج محسن يحل المشكلة في O (√n). هذه طريقة جيدة ما لم يتم تفعيل الأرقام الفردية المثالية. لا يمكننا التحقق من الأرقام المثالية الفردية باستخدام هذا النهج لأنه يعتمد على "صيغة إقليدس للأرقام المثالية" التي تعمل فقط مع الأعداد المثالية.
هل بايثون مناسبة للبرمجة التنافسية؟
تطورت Python من C / C ++ وحتى Java وتعتبر أفضل لغة مناسبة لأغراض البحث والتطوير. ولكن عندما يتعلق الأمر بالبرمجة التنافسية ، فإن غالبية مجتمع البرمجة يتجنب لغة Python. السبب في كون بايثون هو الأبطأ بين هذه اللغات الثلاث.