المتابعون للمدونة

الاثنين، 31 ديسمبر 2012

حسبة برما


حسبة برما

 

ذات يوم كانت سيدة من قرية (برما) التابعة لمركز طنطا بمحافظة  لغربية، تسير وهي تحمل سلة بيض، وفجأة اصطدم بها رجل فسقط البيض وانكسر.. سألها الرجل عن عدد البيض ليدفع لها ثمنه، فقالت له: لا أعرف عدد البيض بالضبط، لكن كل ما أعرفه هو:

- أنني إذا وزعته على سلتين تتبقى بيضة زائدة.

- وإذا وزعته علي ثلاث سلال تتبقى بيضة زائدة.

- وإذا وزعته علي أربع سلال تتبقى بيضة زائدة.

- وإذا وزعته علي خمس سلال تتبقى بيضة زائدة.

- وإذا وزعته علي ست سلال تتبقى بيضة زائدة.

- وإذا وزعته علي سبع سلال لا يتبقى أي شيء من البيض خارج السلال.

هل تستطيع رسم مخطط تدفق Flowchart يحل هذه الحسبة التي أرهقت أهل (برما) برمتهم؟

ج: لم يكن أهل (برما) محظوظين بالتأكيد لأنهم ليسوا مبرمجين، فالأمر يغدو في غاية البساطة باستخدام الحاسب!
الفكرة هنا هي أن نستخدم متغيرا اسمه n تبدأ قيمته بواحد، ونستمر في زيادة قيمته بواحد داخل جملة تكرار Loop، ولا نتوقف عن فعل هذا إلا إذا تحققت كل الشروط الستة التالية معا:

n mod 2 = 1,      n mod 3 = 1,      n mod 4 = 1

n mod 5 = 1,      n mod 6 = 1,      n mod 7 = 0

حيث mod تعني باقي القسمة.. فمثلا n mod 2 تعني الباقي من قسمة n على 2.. وهكذا.

لاحظ أن فشل شرط واحد من هذه الشروط يكفي لمعرفة أن الرقم n لا يصلح لحل حسبة برما، لهذا فلا داعي لفحص باقي الشروط، وعلينا القفز مباشرة إلى السطر الذي نزيد فيه قيمة n بواحد لفحص رقم جديد.

أما إذا تحققت كل الشروط معا، فهذا يعني أن الرقم الموجود في المتغير n في هذه اللحظة هو عدد البيض، وعلينا عرضه على الشاشة وإنهاء البرنامج.

والصورة التالية توضح مخطط تدفق حسبة (برما).

لاحظ أنك لو نفذت هذا المخطط بكود فيجيوال بيزيك، فستحصل في أقل من ثانية واحدة على ناتج يخبرك أن عدد البيض هو 301 بيضة.. هل تصدق أن هذه هي "حسبة برما" التي يضرب بها الناس المثل؟!!

وهناك ملحوظة أخرى هامة تتعلق بتحسين أداء البرنامج.. فما فعلناه هو إلقاء العبء كاملا على كاهل الحاسوب، دون أي تدخل من ذكائنا الإنساني، مع أننا بملاحظة بسيطة سنكتشف أن العدد الذي يحل حسبة (برما) لا بد أن يكون من مضاعفات الرقم 7، لأن قسمة عدد البيض على 7 هي الحالة الوحيدة التي لا يتبقى فيها باق!

هذه الملحوظة البسيطة يمكن أن تساعدنا في تحسين سرعة البرنامج إلى سبعة أضعاف.. فبدلا من أن نزيد قيمة المتغير n بواحد، سنجعل قيمته المبدئية 7 ونزيده في كل مرة بمقدار 7، ليكون باستمرار أحد مضاعفات العدد 7.. أليس هذا أذكى ويوفر 6/7 من الوقت الذي يستهلكه البرنامج؟

سأترك لك تعديل خريطة التدفق للاستفادة من هذه الفكرة.

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر