【问题标题】:Narcissistic numbers in PythonPython中的自恋数字
【发布时间】:2019-10-23 15:03:16
【问题描述】:

我是 Python 编程语言的初学者,我一直在使用一个网站来帮助我锻炼。如果给定的数字是narcissistic,那么它给了我一个挑战,如果程序返回true,否则返回false。

自恋数字示例:

153 (3 digits): 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
1634 (4 digits): 1^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 1634

但由于某种原因,当给定数字 371 时,函数返回 False 而不是 True

代码:

def narcissistic(value):
    logical = True
    logical2 = True
    i = 0
    j = 0
    notation = 10
    sum = 0

    #Calculating the number notation 
    while logical:
        if 10 ** i <= value:
            notation = 10 ** i
            i = i + 1
        else:
            logical = False

    #i from now on is also the qauntity of digits
    while logical2:
        if ( notation / 10 ** j ) >= 1:
            sum = sum + ( value // ( notation / 10 ** j ) ) ** i
            j = j + 1
        else:
            logical2 = False

    if sum == value:
        return True
    else:
        return False

【问题讨论】:

  • 什么是自恋数字?
  • @Hippolippo 重新阅读问题 - 编辑使其更清晰。
  • 顺便说一句,如果您将数字转换为字符串并使用数字进行计算,您的算法可能会更好。
  • 这个 Wolfram 链接 mathworld.wolfram.com/NarcissisticNumber.html 开始谈论以 10 为基数的数字,就像 OP 一样。
  • 不要将变量命名为 sum

标签: python function


【解决方案1】:

您的代码非常接近!问题出在这里:

sum = sum + ( value // ( notation / 10 ** j ) ) ** i

对于1634,这乘以1161631634。您只需要这些数字的 LSB,在此示例中为 1634 - 使用取模运算符来获得。如果我们将它们修改 10 以仅获得 LSB...

sum = sum + (( value // ( notation / 10 ** j ) ) % 10) ** i

...然后代码完美运行。

Demo

【讨论】:

    【解决方案2】:

    将值转换为字符串并返回可能会更容易完成此任务。取字符串的长度是获取位数(“穷人的对数”)的一种简单方法,并且您可以轻松地遍历单个数字:

    def narcissistic(value):
        str_value = str(value)
        num_digits = len(str_value)
        return (value == sum(int(digit) ** num_digits for digit in str_value))
    
    >>> narcissistic(153)
    True
    >>> narcissistic(1634)
    True
    >>> narcissistic(371)
    True
    >>> narcissistic(372)
    False
    

    【讨论】:

      【解决方案3】:

      可以在不转换为字符串的情况下获取单个数字

      import math
      def narcissistic(value):
          n = math.floor(math.log10(value)) + 1
          x = [math.floor((value/10**i)%10)**n for i in range(n)]   
          print(sum(x) == value)
      
      narcissistic(371)
      #True
      

      【讨论】:

      • 即使我在处理(整数)数字时也更喜欢使用数学运算,但在 Python 中使用字符串会更快。
      【解决方案4】:

      把 ^ 改成 **

      def narcissistic(number):
        number_string = str(number)
        number_len = len(number_string)
      
        number_nar = 0
        for char in number_string:
          number_nar+= int(char) ** number_len        
        return number_nar
      
      number = 153
      number_nar = narcissistic(number)
      print(number_nar)
      
      number = 1634
      number_nar = narcissistic(number)
      print(number_nar)
      

      输出:

      153
      
      1634
      

      【讨论】:

        【解决方案5】:

        这可以在 1 行代码中使用列表理解来解决。

        def Narcissistic(x):
                y = sum([int(i)**(len(x)) for i in (x)])
        return Narcissistic(x)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-06
          • 1970-01-01
          • 2020-07-10
          • 1970-01-01
          • 2021-04-12
          • 2016-05-01
          • 1970-01-01
          相关资源
          最近更新 更多