Поиск чисел, равных сумме факториалов своих цифр

8 апреля 2009

В этой статье вы узнаете, как решить и написать следующую задачу на C#:

- Найти числа, равные сумме факториалов своих цифр. Например, 1!+4!+5! = 145

Поиск чисел, равных сумме факториалов своих цифр

Поиск чисел, равных сумме факториалов своих цифр

Как эта задача решается? Мы устанавливаем диапазон чисел, среди которых будем искать такие числа, которые равны сумме факториалов своих цифр. Дальше находим факториал каждой цифры данного числа, суммируем суммы факториалов и проверяем на равенство: [сумма] = [число], где [сумма] - это, найденная сумма факториалов всех цифр данного числа, а [число] – данное число в диапазоне. Так вот, если равенство выполняется, то сохраняем это выражение в массив. Теперь реализуем этот алгоритм в программный код.

Для начала напишем рекурсивную функцию нахождения факториала числа. Факториал находится так: все числа от 1 до числа, факториал которого нужно найти, перемножаем.
Готовый код этой функции:

int fact(int f) {
	int fact = 1;
	for (int i = 1; i < = f; i++)
		fact *= i;
		
	return fact;
}

Процедура для кнопки “Найти”:

private void button1_Click(object sender, EventArgs e) {
	int q = 0;
	String str = "", sint = "";
	listBox1.Items.Clear();
	DateTime start = (DateTime.Now);
	for (int dip = Convert.ToInt32(textBox1.Text); dip < = Convert.ToInt32(textBox2.Text); dip++) {
		q = 0;
		sint = Convert.ToString(dip);
		int[] mass = new int[sint.Length];
		for (int i = 0; i < sint.Length; i++) {
			q += sint.Substring(i, 1) == "0" ? 1 : sint.Substring(i, 1) == "1" ? 1 :
			sint.Substring(i, 1) == "2" ? 2 : fact(Convert.ToInt32(sint.Substring(i, 1)));
			mass[i] = Convert.ToInt32(sint.Substring(i, 1));
		}
		if (q == dip) {
			str = "";
			for (int i = 0; i < sint.Length; i++) {
				if (i < sint.Length - 1)
					str = str + Convert.ToString(mass[i]) + "! + ";
				else
					str = str + Convert.ToString(mass[i]) + "! = ";
			}
			listBox1.Items.Add(str + sint);
		}
	}
	DateTime end = (DateTime.Now);

	listBox1.Items.Add("Время выполнения: " + Convert.ToString(end — start));
}

По ходу работы программы выполняется на такие цифры как 0, 1 и 2, для них мы не выполняем поиск факториала, а просто приравниваем 1, 1 и 2 соответственно. Так как 0! = 1, 1! = 1, а 2! = 2, то мы не будем тратить процессорное время на запуск функции нахождения факториала, а приравняем соответствующие значения.
Код процедуры “Завершить работу”:

private void button3_Click(object sender, EventArgs e) {
	Application.Exit();
}
Поиск чисел, равных сумме факториалов своих цифр

Поиск чисел, равных сумме факториалов своих цифр

В этой процедуры, вызываемой нажатием на кнопку “Завершить работу”, мы вызываем событие выхода из программы.
На рисунке приведен результат выполнения программы. Диапазон использовался от 0 до 1 млн. В этом диапазоне, как видите, найдено всего 4 числа, которые необходимо найти по заданию.

Автор: Евтеев Евгений Александрович