diff --git a/Maths/ArmstrongNumber.ts b/Maths/ArmstrongNumber.ts new file mode 100644 index 00000000..78776127 --- /dev/null +++ b/Maths/ArmstrongNumber.ts @@ -0,0 +1,29 @@ +/** + * @function ArmstrongNumber + * @description Check if the provided number is an Armstrong number or not. + * @summary Armstrong numbers are numbers, the sum of whose digits each raised + * to the power of the number of digits is equal to the number itself. + * For example: + * 370 is an Armstrong number since 3^3 + 7^3 + 0^3 = 370 + * (These numbers are also known as Narcissistic numbers, and Pluperfect numbers) + * @param {number} num The number you want to check for + * @return {boolean} Whether the input number is an Armstrong number + * @see [Wikipedia](https://en.wikipedia.org/wiki/Armstrong_number) + * @see [OEIS](https://oeis.org/A005188) + * @example ArmstrongNumber(370) = true + * @example ArmstrongNumber(10) = false + */ +export const ArmstrongNumber = (num: number): boolean => { + if (typeof num !== 'number' || num <= 0) return false; + + let compNum = 0 + let cloneNum = num + const numOfDigits = Math.floor(1 + Math.log10(num)) + + while (cloneNum > 0) { + compNum += Math.pow(cloneNum % 10, numOfDigits) + cloneNum = Math.floor(cloneNum / 10) + } + + return compNum === num +} diff --git a/Maths/test/ArmstrongNumber.test.ts b/Maths/test/ArmstrongNumber.test.ts new file mode 100644 index 00000000..5ff38656 --- /dev/null +++ b/Maths/test/ArmstrongNumber.test.ts @@ -0,0 +1,5 @@ +import { ArmstrongNumber } from "../ArmstrongNumber" + +test.each([[9, true], [-310, false], [0, false], [407, true], [420, false], [92727, true], [13579, false]])('i is an Armstrong number or not', (num, expected) => { + expect(ArmstrongNumber(num)).toBe(expected) +})