Числа Армстронга

Число Армстронга – натуральне число, яке рівне сумі своїх власних цифр піднесених до степеня, що дорівнює довжині числа. Наприклад: 371 = 33 + 73 + 13.

Метод для перевірки, чи є задане число числом Армстронга

Оскільки для перевірки, нам потрібно працювати з окремими цифрами числа, напишемо метод для отримання масиву цифр заданого числа:

static uint[] SplitNumber(uint n)
{
    var result = new uint[0];
    int i = 0;
    while (n > 0)
    {
        //збільшуємо розмір масиву
        Array.Resize(ref result, i + 1);
        //виділяємо останню цифру числа
        result[i] = n % 10;
        //відкидаємо останню цифру числа
        n = n / 10;
        i++;
    }

    //перевертаємо масив
    Array.Reverse(result);
    return result;
}

Також нам знадобиться метод для піднесення чисел до степеня, для цього використовуємо рекурсивну функцію:

  • x0 = 1;
  • xy = x * xy - 1.
static uint Power(uint x, uint y)
{
    return y == 0 
        ? 1 //число в нульовому степені повертає 1
        : x * Power(x, y - 1);
}

Можна використовувати стандартний метод Math.Pow.

Всі необхідні методи в нас є, можна написати метод перевірки чи відповідає задане число вимогам до чисел Армстронга:

static bool IsArmstrongNumber(uint number)
{
    var digits = SplitNumber(number); 
    var sum = 0u;
    var p = (uint)digits.Length; //степінь
    //в циклі обчислюємо суму
    foreach (var digit in digits)
    {
        sum += Power(digit, p);
    }

    return sum == number;
}

Пошук всіх тризначних чисел Армстронга

Напишемо програму для знаходження всіх чисел Армстронга в заданому діапазоні:

static void Main(string[] args)
{
    Console.Write("Початок діапазону: ");
    var s = Convert.ToUInt32(Console.ReadLine());
    Console.Write("Кінець діапазону: ");
    var e = Convert.ToUInt32(Console.ReadLine());

    Console.WriteLine("Числа Армстронга з діапазону від {0} до {1}", s, e);
    for (uint i = s; i <= e; i++)
    {
        if (IsArmstrongNumber(i))
        {
            Console.Write("{0} ", i);
        }
    }

    Console.ReadLine();
}

Якщо вказати діапазон від 100 до 999, програма виведе на екран всі тризначні числа Армстронга(153, 370, 371, 407):

Для пошуку чотиризначних достатньо змінити діапазон на (1000 - 9999):

В результаті отримаємо: 1634, 8208, 9474.

Дивіться також: