يونيو 05، 2009

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

سنحاول معا أن نتعلم بايثون من خلال إيجاد حلول لمشاكل المشروع Euler Project. في كل يوم سأضع مشكلة جديدة و سأضع الحل الذي توصلت إليه بعد يومين. أرجوا أن يشارك الكل بلغة البرمجة التي يفضلها.

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


المشكلة رقم 1:
إذا قمنا بجرد كل الأرقام الطبيعية تحت العدد 10 بحثا عن  مضاعفات العدد 5 أو 3 سنجد 3، 5، 6 و 9. و إذا قمنا بحساب مجموع هذه الأرقام سنجد الخارج هو 23.

المطلوب:
قم بحساب مجموع مضاعفات 3 أو 5 تحت العدد 1000.

الحل:
result = 0
for i in range(1, 999+1):
    if i % 3 == 0 or i % 5 == 0:
        result += i

print result

الشرح:
1. سنستعمل المتغيرة result تخزين المجموع. و في الداية ستكون قيمتها تساوي 0
2. علينا أن نبحث عن جميع الأرقام تحت العدد 1000 (من 1 إلى 999) عن مضاعفات 3 أو 5. و لترجمة ذلك إلى لغة بايثون نستعمل for i in range(1, 999+1) و التي ستقوم بالدوران في حلقة تبدأ من 1 و تنتهي قبل الألف بمعنى عند 999.
3. في كل مرحلة من مراحل دوران تلك الحلقة تكون المتغيرة i تمثل قيمة أو رقم المرحلة. بمعنى 1, 2, 3, إلى أن تصل إلى 999. و نحن سنقوم بإختبار قيمة المتغيرة i في كل دورة و نرى هل يكون الباقي يساوي 0 إذا تمت قسمتها على 3 أو 5 قسمة أعداد صحيحة (بمعنى دون إجراء القسمة لحساب الأرقام بعد الفاصلة.)
4. هذا الإختبار إما أن يكون صحيح أو خطأ. إذا كان صحيح نظيف قيمة المتغيرة i إلى المتغيرة result. إذا كانت نتيجة الإختبار خاطئة تكمل الحلقة دورانها إلى أن تجد مجددا قيمة يمكن قسمتها على 3 أو 5 بباق يساوي0
5. بعد الإنتهاء من الدوران على كل قيم الحلقة نقوم بعرض نتيجة المتغيرة result


للمتقدمين في بايثون:
هل هنالك حلا آخر؟ مثلا في سطر واحد؟

الحل في سطر واحد:
print  sum([ i for i in range(1, 999+1) if i%3 == 0 or i%5 == 0])

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

  1. السلام عليكم
    قمت باستخدام لغة البايثون لحل هذه المشكلة:


    result = 0
    for number in range(1000):
    if (number%3==0 or number%5==0):
    result+=number

    print result


    المشكلة بس في المسافات هنا في المدونة

    ردحذف
  2. غير معرف5/6/09 6:43 م

    موضوع جميل و مفيد :)

    استخدمت لغة الـ PHP

    $number = 0;
    while ( $number < 1001 )
    {
    if ($number%3==0 || $number%5==0)
    echo $number ;
    $number++;
    }

    الكود ينقصة تجات الـ PHP فقط لان غير مسموح بكتابتها في التعليق

    ردحذف
  3. لقد وضعت الحل.

    جيد BooDy :)

    و بالنسبة ل hunikal كان الخطأ بسيط (ربما لم أشرح جيدا)

    ردحذف
  4. لقد أضفت الحل في سطر واحد.

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

    int result=0, int i;
    for(i=0; i<= 1000; i++)
    {
    if ( i%3==3 or i%5==5)
    result +=i;
    }
    printf("Result is: %i", result);

    أممم، ألاحظ أن لا اختلاف كبير بين بايثون و سي.
    بقيت ملاحظة: يفضل عدم استخدام int للأعداد الكبيرة (و كذلك الاحتمالات الكبيرة)، float أو double خيار مناسب.

    ردحذف
  6. @محمد: جيد :). نعم كما أشرت بايثون و سي متشابهين و هذا ما يسرع عملية التعلم لمن لذيه التجربة.

    و هذا هو كودك بعد تصحيحه:
    int result=0; int i;
    for(i=0; i<= 1000; i++)
    {
    if (i%3==0 || i%5==0)
    result +=i;
    }
    printf("Result is: %i", result);

    عمل جيد :)

    ردحذف
  7. ههه خطأ مطبعي فقط، كتبت or عوض ||
    ^_^

    ردحذف