تابع للموضوع السابق
https://arabia.io/programmi...لتسهيل قراءة الردود فضلا استخدم خدمة مثل pastebin أو repl.it أو والأفضل
نريد عمل برنامجين الأول يمر على الأعداد الصحيحة الفردية أكثر من3 ودون حد معين ويضع 0 إن كان مركب و 1 إن كان أولي ويجمع كل 8 بتات منها في بايت واحد أي unsigned char مرتبة البتات فيه من جهة الأصغر قيمة LSB ثم تكتب البايت في ملف primes.db ثم البايت التالي حتى ننهي كل الأعداد
البرنامج الثاني يفحصل أولية العدد كالتالي
إذا كان 2 فهو أولي
إذا كان زوجي فهو مركب
إذا كان فردي اطرح منه 3 ثم إزحه لليمين (اقسمه على 2) يعني مثلا 3 تصبح 0 و 5 تصبح 1 و 7 تصبح 2 و 9 تصبح 3 وهكذا
الرقم الناتج نزيح عن بداية الملف بمقدار مقسومه على 8 ثم اقرأ بايت واحد من الملف مثلا عند فحص هل 997 أولي؟ يكون البت المطلوب هو البت رقم 994 ومنها الإزاحة عن بداية الملف هي 497 بايت.
ننظر للبت الذي هو باقي القسمة على 8 (من خلال عمل bit-wise or مع 7 ثم إزاحة الواحد بمقداره ثم استعماله كقناع mark) فإن كان 1 فهو أولي وإلا فهو مركب.
التعليقات
قمت بالتخلي عن الحفظ في ملف حتى يتمكن أصحاب جافاسكربت في المتصفحات المشاركة.
هذا الحل في بايثون
نقاط القوة
استخدام array.array من نوع B وهي أسرع من استعمال منظومة عادية list أو tuple كما أنها تحجز بايت واحد وكأنها سلسلة نصية
استعملنا set لتوفير الذاكرة فهي لا تحتفظ إلا بالعناصر
استعمال العمليات الثنائية binary للحصول على أعلى سرعة
فحصل هل عدد معين أولي أم لا يكون بالنظر في بت واحد دون أي حلقات تكرارية
استخدام البرمجة الكينونية
امكانية استخراج الأعداد الأولية التي تقل عن رقم معين من خلال النظر في البتات في bit field
نقاط الضعف:
- تجاوز الحد الأعلى يلقي استثناء throw exception
ألن يكون من الجميل أن تضع شرحا للخوارزمية، حاول شرحها وكأنك تتكلم مع طفل في 6. فبهذه الطريقة ستصل الفكرة بشكل أفضل
حلي للخورازمية الأولى:
لم أفهم ما تقصده بـ"ودون حد معين ... حتى ننهي كل الأعداد"، متى من المفترض أن ينتهي البرنامج؟ أنا افترضت أن الحد سيكون معطى للدالة.
أيضا قمت بالتخلي عن الحفظ في ملف وإرجاع String
الكود يحتوي على تعليقات تبين طريقة عمله، أتمنى إني فهمت السؤال صح.
هذه الصورة توضح الطريقة