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