يونيو 06، 2009

مشروع Euler project: المشكلة رقم 2

المشكلة رقم 2:
كل عدد جديد في متتالية فيبوناتشي يتشكل من مجموع العددين السابقين له.

و باستخدام 1 و 2 ستكون 10 العناصر الأولى كالتالي:
1,2,3,5,8,13,21,34,55,89,...

المطلوب:
ابحث عن مجموع الأعداد الزوجية في السلسلة التي لا يتجاوز أكبر عنصر فيها 4 ملايين.

الحل:
a, b = 1, 2
fibsum = 0

while  b <= 4000000:
   
    if  b % 2 == 0:
        fibsum += b

    a, b = b, a + b

print  fibsum

الشرح:
1. نقوم بإستعمال متغيرتين a و b. نعطي للأولى 1 كقيمة و للثانية 2 كقيمة.
2. نستعمل متغيرة بإسم fibsum قيمتها في البداية هي 0 و سنستعملها لتخزين مجموع الأعداد الزوجية التي سنكتشفها عند القيام بحساب متتالية فيبوناتشي.
3. سنقوم بإستخدام حلقة while و هذا النوع من الحلقات يستمر في الدوران حول نفسه ما دام الشرط صحيح. الشرط الذي إستخدمناه هو "ما دامت قيمة b أصغر من 4000000"
4. عند كل دورة من دورات الحلقة يتم التحقق من قابلية قسمة قيمة المتغيرة b على 2، و حيث يكون الباقي هو 0
5. إذا كان الشرط صحيحا تتم عملية جمع قيمة b بمجموع قيمة fibsum ثم تحديث هذه الأخيرة بالنتيجة التي حصلنا عليها من عملية الجمع.
6. في السطر الذي يحتوي على a, b = b, a + b يتم إسناد قيمة المتغيرة b إلى a و إسناد مجموع قيمة a+b إلى b في آن واحد.
7. عند الإنتهاء الحلقة من الدوران (عندما يصبح شرطها خاطئا) يتم عرض النتيجة (قيمة المتغيرة fibsum)


هل توصلتم إلى طريقة أخرى؟

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

  1. لقد وضعت الحل، هل من أحد يعيد صياغة الحل بلغته المفضلة !؟

    ردحذف
  2. باستخدام لغة C:

    int a=1, b, result=0;
    for(b=2; b<=4000000; b++)
    {
    if( b%2==0)
    result+=b;
    a=b; b=a+b;
    }
    printf("%i", result);

    هناك خطأ صغير في حلي هذا (حسب ما أعتقد)، من يكتشفه :)

    ردحذف
  3. @محمد: هذا الكود لم يعطي النتيجة المطلوبة. كذلك لا أعتقد أن الحلقة التسلسلية for صالحة في هذه الحالة لأن قيمة b لا تتدرج على كل السلسلة (من 1 إلى 4 ملايين) بل إن قيمتها الجديدة في كل دورة تساوي نفس قيمتها الحالية بالإضافة إلى قيمة a السابقة.

    ردحذف