Python/maths/armstrong_numbers.py
Grigoriy Hanin b3b89d9460
Armstrong number definition fix (#4466)
This is a documentation fix. This fix patches a mistake in the description of the Armstrong number.

* * Doc fix

* Armstrong number is not the sum of cube's of number digits, but
the sum of number's digits each raised to the power of the number of digits

* Update armstrong_numbers.py

Line shorten
2021-05-30 18:41:07 -05:00

71 lines
1.9 KiB
Python

"""
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 3*3*3 + 7*7*7 + 0*0*0 = 370.
An Armstrong number is often called Narcissistic number.
"""
def armstrong_number(n: int) -> bool:
"""
Return True if n is an Armstrong number or False if it is not.
>>> armstrong_number(153)
True
>>> armstrong_number(200)
False
>>> armstrong_number(1634)
True
>>> armstrong_number(0)
False
>>> armstrong_number(-1)
False
>>> armstrong_number(1.2)
False
"""
if not isinstance(n, int) or n < 1:
return False
# Initialization of sum and number of digits.
sum = 0
number_of_digits = 0
temp = n
# Calculation of digits of the number
while temp > 0:
number_of_digits += 1
temp //= 10
# Dividing number into separate digits and find Armstrong number
temp = n
while temp > 0:
rem = temp % 10
sum += rem ** number_of_digits
temp //= 10
return n == sum
def narcissistic_number(n: int) -> bool:
"""Return True if n is a narcissistic number or False if it is not"""
expo = len(str(n)) # power, all number will be raised to
# each digit will be multiplied expo times
temp = [(int(i) ** expo) for i in str(n)]
# check if sum of cube of each digit is equal to number
return n == sum(temp)
def main():
"""
Request that user input an integer and tell them if it is Armstrong number.
"""
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.")
if __name__ == "__main__":
import doctest
doctest.testmod()
main()