an armstrong number is equal to the sum of its own digits each raised to the power of the number of digits for example 370 is an armstrong number because 333 777 000 370 armstrong numbers are also called narcissistic numbers and pluperfect numbers online encyclopedia of integer sequences entry https oeis orga005188 return true if n is an armstrong number or false if it is not allarmstrongnumbern for n in passing true anyarmstrongnumbern for n in failing false initialization of sum and number of digits calculation of digits of the number dividing number into separate digits and find armstrong number return true if n is a pluperfect number or false if it is not allarmstrongnumbern for n in passing true anyarmstrongnumbern for n in failing false init a histogram of the digits return true if n is a narcissistic number or false if it is not allarmstrongnumbern for n in passing true anyarmstrongnumbern for n in failing false check if sum of each digit multiplied expo times is equal to number request that user input an integer and tell them if it is armstrong number return true if n is an armstrong number or false if it is not all armstrong_number n for n in passing true any armstrong_number n for n in failing false initialization of sum and number of digits calculation of digits of the number dividing number into separate digits and find armstrong number return true if n is a pluperfect number or false if it is not all armstrong_number n for n in passing true any armstrong_number n for n in failing false init a histogram of the digits return true if n is a narcissistic number or false if it is not all armstrong_number n for n in passing true any armstrong_number n for n in failing false the power that all digits will be raised to check if sum of each digit multiplied expo times is equal to number request that user input an integer and tell them if it is armstrong number
PASSING = (1, 153, 370, 371, 1634, 24678051, 115132219018763992565095597973971522401)
FAILING: tuple = (-153, -1, 0, 1.2, 200, "A", [], {}, None)


def armstrong_number(n: int) -> bool:
    
    if not isinstance(n, int) or n < 1:
        return False

    
    total = 0
    number_of_digits = 0
    temp = n
    
    number_of_digits = len(str(n))
    
    temp = n
    while temp > 0:
        rem = temp % 10
        total += rem**number_of_digits
        temp //= 10
    return n == total


def pluperfect_number(n: int) -> bool:
    
    if not isinstance(n, int) or n < 1:
        return False

    
    digit_histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    digit_total = 0
    total = 0
    temp = n
    while temp > 0:
        temp, rem = divmod(temp, 10)
        digit_histogram[rem] += 1
        digit_total += 1

    for cnt, i in zip(digit_histogram, range(len(digit_histogram))):
        total += cnt * i**digit_total

    return n == total


def narcissistic_number(n: int) -> bool:
    
    if not isinstance(n, int) or n < 1:
        return False
    expo = len(str(n))  
    
    return n == sum(int(i) ** expo for i in str(n))


def main():
    
    num = int(input("Enter an integer to see if it is an Armstrong number: ").strip())
    print(f"{num} is {'' if armstrong_number(num) else 'not '}an Armstrong number.")
    print(f"{num} is {'' if narcissistic_number(num) else 'not '}an Armstrong number.")
    print(f"{num} is {'' if pluperfect_number(num) else 'not '}an Armstrong number.")


if __name__ == "__main__":
    import doctest

    doctest.testmod()
    main()