Python 充足、不足或完美的数字

Python abundant, deficient, or perfect number

def classify(numb):
    i=1
    j=1
    sum=0
    for i in range(numb):
        for j in range(numb):
            if (i*j==numb):
                sum=sum+i
                sum=sum+j
            if sum>numb:
                print("The value",numb,"is an abundant number.")
            elif sum<numb:
                print("The value",numb,"is a deficient number.")
            else:
                print("The value",numb,"is a perfect number.")
            break
    return "perfect"

该代码采用一个数字 (numb) 并将其分类为丰富、不足或完美的数字。我的输出很奇怪,只适用于某些数字。我认为这是我使用不正确的缩进或中断。帮助将不胜感激。

我强烈建议你创建一个函数来创建给定 N 的适当除数,然后,工作会很容易。

def get_divs(n):
    return [i for i in range(1, n) if n % i == 0]


def classify(num):
    divs_sum = sum(get_divs(num))
    if divs_sum > num:
        print('{} is abundant number'.format(num))
    elif divs_sum < num:
        print('{} is deficient number'.format(num))
    elif divs_sum == num:
        print('{} is perfect number'.format(num))

你在某处误解了一些东西。正如您正在打印数字的种类一样,与数字的值一样多。我可能会遗漏一些东西,但无论如何。

可以通过使用模

天真地求出真约数的和
def classify1(num):
    div_sum = sum(x for x in range(1, num) if num % x == 0)
    kind = ""
    if div_sum < num:
        kind = "deficient"
    elif div_sum > num:
        kind = "abundant"
    else:
        kind = "perfect"
    print("{} is a {} number".format(num, kind))

但是对于大数字或者可能是数字,这将需要很长时间。所以我欢迎你使用除数函数。我只是把它扔掉并解释一下。

def mark(li: list, x: int):

    for i in range(2*x, len(li), x):
        li[i] = False
    return li


def sieve(lim: int):
    li = [True] * lim
    li[0] = li[1] = 0
    for x in range(2, int(lim ** 0.5) + 1):
        if x:
            li = mark(li, x)
    return [2]+[x for x in range(3, lim, 2) if li[x]]


def factor(num):

    divs = list()
    for prime in primes:
        if prime * prime > num:
            if num > 1:
                divs += [num]
            return divs
        while num % prime == 0:
            num //= prime
            divs += [prime]
    else:
        return divs


def divisors_sum(num):
    """
    Function that implements a geometric series to generate the sum of the
     divisors, but it is not the divisor function since removing original
     number.
    """
    divs = factor(num)
    div_sum, s = 1, 0
    for div in set(divs):
        s = 0
        for exponent in range(0, divs.count(div) + 1):
            s += div ** exponent
        div_sum *= s
    else:
        return div_sum - num


primes = sieve(limit)

但是.. 由于没有太多解释,首先对数字进行素因数分解,然后使用除数函数得到正确的除数和。这就对了。然而,加速速度快得离谱。这似乎解决了这个问题,但它更酷、更快。