جواب سوال 21 ProjectEuler: اعداد دوستداشتنی Amicable numbers

پروژه اویلر

چالش 20 چندان دلنشین و جذاب نبود بخاطر همین زودتر رفتم سراغ سوال 21

ترجمه دقیق از سوال نمیگذارم چون یک سری کلمات عجیب و غریب توی سوال بود که معنی دقیقی براشون نداشتم! اما مفهوم سوال این هست که d(n) جمع اعدادی هست که به n قابل تقسیم هستند، برای مثال اعداد قابل تقسیم بر 220 این ها هستند: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 و 110 پس d(220) برابر با 284 هست. همچنین d(284) برابر با 220 میشه. سوال خواسته اعداد این چنینی زیر 10000 را پیدا کرده و باهم جمع کرده و نتیجه را اعلام کنیم. d(a) = b and d(b) = a, where a ≠ b

این سوال هم خیلی پیچیده نیست. کدهارو مشاهده کنید:

def divisors(num):
    divisorsOfNum = []
    for i in range(1, (num//2)+1):
        if num % i == 0:
            divisorsOfNum.append(i)
    return divisorsOfNum


def sumOfDivisors(num):
    return sum(divisors(num))


amicableNums = []
for i in range(1,10001):
    n = sumOfDivisors(i)
    if sumOfDivisors(n) == i and n != i:
        amicableNums.append(n)

print(sum(amicableNums))

همانطور که مشخص هست من دو تابع معرفی کردم که یکی اعداد قابل تقسیم عدد داده شده را درون یک لیست برمی گرداند و دیگری جمع این اعداد را. و در خطوط بعد یک حلقه که اعداد 1 تا 10000 را کنترل کرده و اگر شروط سوال برقرار بود عدد مورد نظر را به لیستی که با نام amicableNums ساخته ام اضافه می کند و در خط آخر جمع اعداد درون آن را اعلام می کند.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.