【问题标题】:How can I display all numbers in range 0-N that are "super numbers"如何显示 0-N 范围内的所有“超级数字”数字
【发布时间】:2018-07-25 17:54:59
【问题描述】:
  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") 
    

【问题讨论】:

  • 创建一个接受单个数字并返回它是否为“超级”的函数。你会发现这个功能很有用。
  • 对于“如何迭代一堆数字”这个问题有很多文字......还是我误解了这个问题?
  • @Aran-Fey 只是想为这个问题提供上下文

标签: python python-3.x


【解决方案1】:

现有答案已经展示了如何执行最终循环以将您的功能联系在一起。或者,您还可以使用更多的内置函数和库,例如 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]

【讨论】:

    【解决方案2】:

    首先我会稍微改变一下主代码的执行方式,将主要部分移动到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
    

    小建议 - 您无需在 print() 中调用 str() - int 无论如何都会以相同的方式显示。

    【讨论】:

    • 您的回复非常有帮助,您能否通过将主要部分移至 if name == 'main' 来解释您的意思
    • “主要部分”是指代码的“核心”部分——运行后要运行的那些函数/语句,所以在你的情况下,所有方法都不在任何方法中——所以这些行我输入if __name__ == '__main__':。这样一来,运行代码时会更容易看到会发生什么——if 中的所有内容都将被执行。
    • if __name__ == '__main__': 本身就是当您自己运行脚本时将使用的语句 - 如果模块被导入或以任何其他方式使用,则不会使用它,这是使用的好习惯给它。在掌握了语言本身之后,检查python.org/dev/peps/pep-0008
    • 是的,很高兴了解if __name__ == '__main__':。但是,如果您可以将主代码放入main 函数中,并且在if __name__ == '__main__ 块内调用main(),而不是将代码转储到全局上下文中,那就更好了。当然,对于小型脚本和示例代码,将代码放入全局空间并没有错,但是如果将代码包装在函数中并最大限度地减少全局空间中的实时代码量,它肯定会更整洁(并且通常更有效),这应该主要由类和函数定义占据。
    【解决方案3】:

    我已经很久没有做过很多 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]
    

    【讨论】:

      【解决方案4】:

      我将创建一个查找函数,告诉您单个数字的阶乘。原因是 - 对于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
      

      【讨论】:

        【解决方案5】:

        使用范围。

        for i in range(number): # This iterates over [0, N)
            if (breakdown(number)) == number:
                print(str(number)+ " is super") 
        

        如果您还想包含数字 N,请写为 range(number + 1)

        【讨论】:

          【解决方案6】:

          不太清楚您的要求。从您编写的两个函数来看,您似乎对 Python 编程有扎实的了解。但是从你的问题来看,你甚至不知道如何编写一个简单的循环。

          只回答你的问题,你的主要功能需要的是:

          for i in range(0,number+1):
              if (breakdown(i)) == i:
                  print(str(i)+ " is super")
          

          【讨论】:

          • 我没有包括我制作循环的尝试,因为它会使我的代码阅读起来更加混乱,但我确实与循环斗争并且倾向于过度思考它们,这就是为什么它们看起来不工作。
          【解决方案7】:
          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
          

          【讨论】:

            【解决方案8】:

            我不知道代码的效率如何,但它确实产生了预期的结果:

            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

            【讨论】:

              猜你喜欢
              • 2022-11-10
              • 2015-09-16
              • 1970-01-01
              • 1970-01-01
              • 2019-06-25
              • 1970-01-01
              • 2013-06-19
              • 2021-12-02
              相关资源
              最近更新 更多