Число Армстронга – натуральне число, яке рівне сумі своїх власних цифр піднесених до степеня, що дорівнює довжині числа. Наприклад: 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.