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