يونيو 14، 2009

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

المشكلة رقم 10:
مجموع العداد الأولية تحت 10 هو: 2 + 3 + 5 + 7 = 17

المطلوب:
أجد مجموع كل الأعداد الأولية تحت مليونين.

الحل:
import math

def isPrime(n):
    nbrs = [2] + range(3, int(math.sqrt(n))+1, 2)   
    for i in nbrs:
        if n % i == 0:
            return False
    return True

def sumPrimes(n):
    primes = [2] + [x for x in range(3, n, 2) if isPrime(x)]
    return sum(primes)

print sumPrimes(2000000)

الشرح:
1. نستدعي وحدة الرياضيات math بواسطة التعليمة import
2. نكتب دالة isPrime وظيفتها إختبار العدد الذي تتوصل به كمعيار n هل هو أولي أم لا. ذاخل هذه الذالة ننشئ قائمة بكل العداد بداية من 2 حتى جدع تربيع العدد n مع تفادي كل مضاعفات العدد 2
3. نكتب دالة وظيفتها إنشاء قائمة primes بكل الأعداد من 2 حتى n مع إجتناب مضاعفات العدد 2 و بشرط أن يكون أوليا، ثم بعد ذلك نستخدم الدالة sum حتى تحسب مجموع أعداد هذه القائمة.
4. يتم عرض النتيجة بإستخدام print

هناك تعليقان (2):

  1. int i, j somme=0;
    while (i<2000000 && j<2000000 && i%j!=0)
    {
    somme+=i;
    }
    printf("%i", somme);

    صحيح هكذا؟
    استخدمت while التي نصحتني سابقا بها، ما دام i و j أصغر من مليونين و i عدد أولي فالمتغير somme يستقبل قيمة i و يضيفها لقيمته الأولية.
    ثم نطبع النتيجة طبعا :)

    ردحذف
  2. لقد كتبت الحل مع الشرح.

    @محمد: جيد :) و لكن حلقة واحدة لن تكفي للتسلسل حول كل الأعداد و إختبار هل هي أولية أم لا.

    ردحذف