Add new algorithm for Armstrong numbers
diff --git a/maths/armstrong_numbers.py b/maths/armstrong_numbers.py
index af25688dbacc..ce8c62182fd9 100644
--- a/maths/armstrong_numbers.py
+++ b/maths/armstrong_numbers.py
@@ -1,26 +1,24 @@
 """
-An Armstrong number is equal to the sum of its own digits each raised
-to the power of the number of digits.
+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.
+
+Armstrong numbers are also called Narcissistic numbers and Pluperfect numbers.
+
+On-Line Encyclopedia of Integer Sequences entry: https://oeis.org/A005188
 """
+PASSING = (1, 153, 370, 371, 1634, 24678051, 115132219018763992565095597973971522401)
+FAILING = (-153, -1, 0, 1.2, 200, "A", [], {}, None)
 
 
 def armstrong_number(n: int) -> bool:
     """
     Return True if n is an Armstrong number or False if it is not.
 
-    >>> armstrong_number(153)
+    >>> all(armstrong_number(n) for n in PASSING)
     True
-    >>> armstrong_number(200)
-    False
-    >>> armstrong_number(1634)
-    True
-    >>> armstrong_number(0)
-    False
-    >>> armstrong_number(-1)
-    False
-    >>> armstrong_number(1.2)
+    >>> any(armstrong_number(n) for n in FAILING)
     False
     """
     if not isinstance(n, int) or n < 1:
@@ -43,15 +41,46 @@ def armstrong_number(n: int) -> bool:
     return n == sum
 
 
-def narcissistic_number(n: int) -> bool:
-    """Return True if n is a narcissistic number or False if it is not"""
+def pluperfect_number(n: int) -> bool:
+    """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
+    """
+    if not isinstance(n, int) or n < 1:
+        return False
+
+    # Init a "histogram" of the digits
+    digit_histogram = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
+    digit_total = 0
+    sum = 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))):
+        sum += cnt * i ** digit_total
+
+    return n == sum
 
-    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 narcissistic_number(n: int) -> bool:
+    """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
+    """
+    if not isinstance(n, int) or n < 1:
+        return False
+    expo = len(str(n))  # the power that all digits will be raised to
+    # check if sum of each digit multiplied expo times is equal to number
+    return n == sum(int(i) ** expo for i in str(n))
 
 
 def main():
@@ -61,6 +90,7 @@ 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__":

Add a new algorithm for verify if a number is an Armstrong.

* [x] Add an algorithm?
* [ ] Fix a bug or typo in an existing algorithm?
* [x] Documentation change?

### **Checklist:**
* [x] I have read [CONTRIBUTING.md](https://github.com/TheAlgorithms/Python/blob/master/CONTRIBUTING.md).
* [x] This pull request is all my own work -- I have not plagiarized.
* [x] I know that pull requests will not be merged if they fail the automated tests.
* [x] This PR only changes one algorithm file.  To ease review, please open separate PRs for separate algorithms.
* [ ] All new Python files are placed inside an existing directory.
* [ ] All filenames are in all lowercase characters with no spaces or dashes.
* [x] All functions and variable names follow Python naming conventions.
* [x] All function parameters and return values are annotated with Python [type hints](https://docs.python.org/3/library/typing.html).
* [x] All functions have [doctests](https://docs.python.org/3/library/doctest.html) that pass the automated testing.
* [ ] All new algorithms have a URL in its comments that points to Wikipedia or other similar explanation.
* [ ] If this pull request resolves one or more open issues then the commit message contains `Fixes: #{$ISSUE_NO}`.
