Нарциссические числа в Python - PullRequest
2 голосов
/ 23 октября 2019

Я новичок в языке программирования Python, и я использую веб-сайт, чтобы помочь мне тренироваться. Это дало мне возможность создать программу, которая возвращает значение true, если заданное число равно нарциссическое или иначе ложно.

Примеры нарциссических чисел:

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

Ответы [ 4 ]

4 голосов
/ 23 октября 2019

Ваш код очень близок! Проблема заключается здесь:

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

Для 1634 это умножается на 1, 16, 163 и 1634. Вам нужен только младший бит этих чисел, в этом примере 1, 6, 3 и 4 - используйте оператор modulo, чтобы получить это. Если мы модифицируем их на 10, чтобы получить только LSB ...

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

..., тогда код работает отлично.

Демо

4 голосов
/ 23 октября 2019

Вероятно, было бы легче выполнить эту задачу, преобразовав значение в строку и обратно. Определение длины строки - это простой способ получить количество цифр («логарифм бедняка»), и вы можете легко перебирать отдельные цифры:

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
2 голосов
/ 23 октября 2019

Может захватить отдельные цифры без преобразования в строку

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
0 голосов
/ 23 октября 2019

изменить ^ на **

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...