如何显示范围为0-N的所有“超级数字”

时间:2018-07-04 08:53:07

标签: python python-3.x

  1. 程序要求用户输入一个号码 N

  2. 该程序应该显示范围为0- N 的所有“超级数字”。

      

    超级数:是一个数字,使得其阶乘的和   数字等于数字。

    示例:

    • 12!= 1! + 2! = 1 + 2 = 3(不是超级)
    • 145 = 1! + 4! + 5! = 1 + 24 + 120(超级)
  3. 我似乎停留在的部分是程序显示0- N 范围内的所有“超级数字”数字。我已经得出结论,我需要一个循环来解决此问题,但是我不知道该如何做。因此,例如,该程序应该读取0-50中的所有数字,并且每当数字超时都将显示该数字。因此,由于它们被视为超级

    ,因此仅显示1和2。
    enter integer: 50
    2 is super
    1 is super
    
  4. 我写了两个函数;第一个是常规的阶乘程序,第二个是对数字的阶乘求和的程序:

    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") 
    

8 个答案:

答案 0 :(得分:8)

现有的答案已经显示了如何进行最终循环以将您的函数联系在一起。另外,您还可以使用更多内置函数和库,例如summath.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