11

طبق هذه الخوارزمية بلغتك المفضلة ج2 الأعداد الأولية

تابع للموضوع السابق

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. فبهذه الطريقة ستصل الفكرة بشكل أفضل

الكود أم الخوارزمية؟

الخوارزمية بسيطة نعمل سلسلة نصية أول بت من أول بايت يقابل العدد 3 والثاني يقابل 5 والثالث يقابل 7 والرابع يقابل 9 والخامس 11 وهكذا (الأعداد الأولي)

قيمة هذا البت نجعلها 1 إذا كان أولي ونجعلها 0 إذا كان مركب.

حلي للخورازمية الأولى:

لم أفهم ما تقصده بـ"ودون حد معين ... حتى ننهي كل الأعداد"، متى من المفترض أن ينتهي البرنامج؟ أنا افترضت أن الحد سيكون معطى للدالة.

أيضا قمت بالتخلي عن الحفظ في ملف وإرجاع String

الكود يحتوي على تعليقات تبين طريقة عمله، أتمنى إني فهمت السؤال صح.

نعم دون حد معين أقصد أقل من رقم معطى للدالة. مثلا بما لا يزيد عن 1024 بايت أو كذا رقم ...إلخ.

أظن أن هذه اللغة هي روبي.

ممكن مصدر يشرح الخوارزمية الثانية لأني لم أفهم آخر نقطتين، خصوصا النقطة قبل الأخيرة.

لا مصدر ولا شيء. البايت عبارة عن 8-بت. للوصول للبت رقم 135 يكون رقم البايت هو ناتج القسمة على 8 ورقم البت فيه هو باقي القسمة وفي هذا المثال الناتج هو 16 أي البايت رقم 16 والباقي هو 7 أي آخر بت. الإزاحة والقناع هي العلميات الثنائية المعروفة.

هذه الصورة توضح الطريقة