程序要求用户输入一个号码 N 。
该程序应该显示范围为0- N 的所有“超级数字”。
超级数:是一个数字,使得其阶乘的和 数字等于数字。
我似乎停留在的部分是程序显示0- N 范围内的所有“超级数字”数字。我已经得出结论,我需要一个循环来解决此问题,但是我不知道该如何做。因此,例如,该程序应该读取0-50中的所有数字,并且每当数字超时都将显示该数字。因此,由于它们被视为超级
,因此仅显示1和2。enter integer: 50
2 is super
1 is super
我写了两个函数;第一个是常规的阶乘程序,第二个是对数字的阶乘求和的程序:
number = int(input ("enter integer: "))
def factorial (n):
result = 1
i = n * (n-1)
while n >= 1:
result = result * n
n = n-1
return result
#print(factorial(number))
def breakdown (n):
breakdown_num = 0
remainder = 0
if n < 10:
breakdown_num += factorial(n)
return breakdown_num
else:
while n > 10:
digit = n % 10
remainder = n // 10
breakdown_num += factorial(digit)
#print (str(digit))
#print(str(breakdown_num))
n = remainder
if n < 10 :
#print (str(remainder))
breakdown_num += factorial(remainder)
#print (str(breakdown_num))
return breakdown_num
#print(breakdown(number))
if (breakdown(number)) == number:
print(str(number)+ " is super")
答案 0 :(得分:8)
现有的答案已经显示了如何进行最终循环以将您的函数联系在一起。另外,您还可以使用更多内置函数和库,例如sum
或math.factorial
,并且为了获取数字,您可以仅迭代数字的字符串表示形式中的字符。
通过这种方式,可以在一行代码中解决问题(尽管将is-super检查移至单独的函数可能会更好。)
def issuper(n):
return sum(math.factorial(int(d)) for d in str(n)) == n
N = 1000
res = [n for n in range(1, N+1) if issuper(n)]
# [1, 2, 145]
答案 1 :(得分:4)
首先,我将通过将主要部分移至if __name__ == '__main__'
来稍稍改变执行主要代码的方式,这些部分将在将.py
作为主文件运行后执行:
if __name__ == '__main__':
number = int(input ("enter integer: "))
if (breakdown(number)) == number:
print(str(number)+ " is super")
在那之后,似乎更清楚了应该如何遍历数字,所以而不是上面的是:
if __name__ == '__main__':
number = int(input ("enter integer: "))
for i in range(number+1):
if (breakdown(i)) == i:
print(str(i)+ " is super")
示例输入和输出:
enter integer: 500
1 is super
2 is super
145 is super
小建议-您无需在str()
中致电print()
-仍然会以相同的方式显示int
。
答案 2 :(得分:4)
我已经很长时间没有做太多Python了,但是我尝试了自己的尝试来解决这个问题,我认为这更容易理解。对于它的价值,我假设当您说“显示0-N范围内的所有数字”时,它是一个排他的上限,但是如果我错了,很容易将其设为包含性的上限。
import math
def digits(n):
return (int(d) for d in str(n))
def is_super(n):
return sum(math.factorial(d) for d in digits(n)) == n
def supers_in_range(n):
return (x for x in range(n) if is_super(x))
print(list(supers_in_range(150))) # [1, 2, 145]
答案 3 :(得分:3)
我将创建一个查找功能,告诉您一个数字的阶乘。原因是-对于888888
,您将重新计算8 6次阶乘-在字典中查找它们要快得多。
添加第二个函数,检查是否有数字isSuper()
,然后打印所有超级字符:
# Lookup table for single digit "strings" as well as digit - no need to use a recursing
# computation for every single digit all the time - just precompute them:
faks = {0:1}
for i in range(10):
faks.setdefault(i,faks.get(i-1,1)*i) # add the "integer" digit as key
faks.setdefault(str(i), faks [i]) # add the "string" key as well
def fakN(n):
"""Returns the faktorial of a single digit number"""
if n in faks:
return faks[n]
raise ValueError("Not a single digit number")
def isSuper(number):
"Checks if the sum of each digits faktorial is the same as the whole number"
return sum(fakN(n) for n in str(number)) == number
for k in range(1000):
if isSuper(k):
print(k)
输出:
1
2
145
答案 4 :(得分:2)
使用范围。
* Running on http://0.0.0.0:5001/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 187-502-207
Filename: mp.py
Line # Mem usage Increment Line Contents
================================================
17 40.0 MiB 40.0 MiB @mp.profile
18 def health_check():
19 40.0 MiB 0.0 MiB return jsonify({"message": "success"})
127.0.0.1 - - [04/Jul/2018 11:01:15] "GET /health HTTP/1.1" 200 -
如果您还想包含数字N,则写为for i in range(number): # This iterates over [0, N)
if (breakdown(number)) == number:
print(str(number)+ " is super")
。
答案 5 :(得分:2)
不太了解您要的内容。从编写的两个函数看来,您对Python编程有扎实的知识。但是从您的问题来看,您甚至都不知道如何编写简单的循环。
仅回答您的问题,您主要功能中需要的是:
for i in range(0,number+1):
if (breakdown(i)) == i:
print(str(i)+ " is super")
答案 6 :(得分:1)
import math
def get(n):
for i in range(n):
l1 = list(str(i))
v = 0
for j in l1:
v += math.factorial(int(j))
if v == i:
print(i)
这将打印n
下的所有超级数字。
>>> get(400000)
1
2
145
40585
答案 7 :(得分:1)
我不知道代码的效率如何,但是它确实产生了预期的结果:
def facto():
minr=int(input('enter the minimum range :')) #asking minimum range
maxr=int(input('enter the range maximum range :')) #asking maximum range
i=minr
while i <= maxr :
l2=[]
k=str(i)
k=list(k) #if i=[1,4,5]
for n in k: #taking each element
fact=1
while int(n) > 0: #finding factorial of each element
n=int(n)
fact=fact*n
n=n-1
l2.append(fact) #keeping factorial of each element eg : [1,24,120]
total=sum(l2) # taking the sum of l2 list eg 1+24+120 = 145
if total==i: #checking if sum is equal to the present value of i.145=145
print(total) # if sum = present value of i than print the number
i=int(i)
i=i+1
facto()
输入:minr = 0,maxr = 99999 输出: 1个 2 145 40585