سنحاول معا أن نتعلم بايثون من خلال إيجاد حلول لمشاكل المشروع Euler Project. في كل يوم سأضع مشكلة جديدة و سأضع الحل الذي توصلت إليه بعد يومين. أرجوا أن يشارك الكل بلغة البرمجة التي يفضلها.
سأكتب دروس مبسطة عن بايثون في نهاية هذا الأسبوع، و أنصح بقراءة 90 صفحة الأولى من كتاب بايثون للصديق أحمد يوسف.
المشكلة رقم 1:
إذا قمنا بجرد كل الأرقام الطبيعية تحت العدد 10 بحثا عن مضاعفات العدد 5 أو 3 سنجد 3، 5، 6 و 9. و إذا قمنا بحساب مجموع هذه الأرقام سنجد الخارج هو 23.
المطلوب:
قم بحساب مجموع مضاعفات 3 أو 5 تحت العدد 1000.
الحل:
الشرح:
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
للمتقدمين في بايثون:
هل هنالك حلا آخر؟ مثلا في سطر واحد؟
الحل في سطر واحد:
سأكتب دروس مبسطة عن بايثون في نهاية هذا الأسبوع، و أنصح بقراءة 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
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])
السلام عليكم
ردحذفقمت باستخدام لغة البايثون لحل هذه المشكلة:
result = 0
for number in range(1000):
if (number%3==0 or number%5==0):
result+=number
print result
المشكلة بس في المسافات هنا في المدونة
موضوع جميل و مفيد :)
ردحذفاستخدمت لغة الـ PHP
$number = 0;
while ( $number < 1001 )
{
if ($number%3==0 || $number%5==0)
echo $number ;
$number++;
}
الكود ينقصة تجات الـ PHP فقط لان غير مسموح بكتابتها في التعليق
لقد وضعت الحل.
ردحذفجيد BooDy :)
و بالنسبة ل hunikal كان الخطأ بسيط (ربما لم أشرح جيدا)
لقد أضفت الحل في سطر واحد.
ردحذفباستعمال لغة 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 خيار مناسب.
@محمد: جيد :). نعم كما أشرت بايثون و سي متشابهين و هذا ما يسرع عملية التعلم لمن لذيه التجربة.
ردحذفو هذا هو كودك بعد تصحيحه:
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);
عمل جيد :)
ههه خطأ مطبعي فقط، كتبت or عوض ||
ردحذف^_^