⭐ Необязательные задачи#
Дополнительная тренировка по теме. Решайте, если обязательные задачи уже сданы.
Задача 1. Совершенное число#
Условие#
Число называется совершенным, если оно равно сумме всех своих делителей, кроме самого себя. Например, 6 = 1 + 2 + 3.
Напишите функцию int sumDivisors(int n), которая возвращает сумму собственных делителей числа, и с её помощью определите, является ли число совершенным.
Входные данные#
Одно натуральное число n (n ≤ 10⁶).
Выходные данные#
YES, если число совершенное, иначе NO.
Примеры#
| Ввод | Вывод |
|---|---|
6 |
YES |
28 |
YES |
12 |
NO |
Заметка
Делители 28: 1, 2, 4, 7, 14 — их сумма 28. Делители 12: 1, 2, 3, 4, 6 — их сумма 16. У числа 1 собственных делителей нет, сумма равна 0, поэтому 1 не совершенное.
Задача 2. Цифровой корень#
Условие#
Цифровой корень числа получается так: складываем цифры числа, потом цифры результата, и так далее, пока не останется одна цифра.
Напишите рекурсивную функцию int digitSum(int n) для суммы цифр и рекурсивную функцию int digitalRoot(int n) для цифрового корня.
Входные данные#
Одно натуральное число n.
Выходные данные#
Одно число — цифровой корень.
Примеры#
| Ввод | Вывод |
|---|---|
942 |
6 |
7 |
7 |
99999 |
9 |
Совет
942 → 9 + 4 + 2 = 15 → 1 + 5 = 6. База —n < 10, рекурсивный шаг —digitalRoot(digitSum(n)). Одна функция вызывает другую — это и есть композиция функций.
Задача 3. Последовательность Коллатца#
Условие#
Возьмём натуральное число n. Если оно чётное, делим его на 2, если нечётное — заменяем на 3n + 1. Повторяем, пока не получим 1.
Напишите рекурсивную функцию int steps(int n), которая возвращает количество шагов до получения единицы.
Входные данные#
Одно натуральное число n (n ≤ 10⁶).
Выходные данные#
Одно число — количество шагов.
Примеры#
| Ввод | Вывод |
|---|---|
6 |
8 |
1 |
0 |
27 |
111 |
Заметка
Для 6:
6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1— восемь шагов. База —n == 1(шагов не нужно), рекурсивный шаг —1 + steps(n / 2)для чётного и1 + steps(3 * n + 1)для нечётного. Промежуточные значения могут быть большеn, поэтому для больших чисел безопаснееlong long.
Задача 4. Минимальный делитель#
Условие#
Напишите функцию int minDivisor(int n), которая возвращает наименьший делитель числа n, больший 1.
Входные данные#
Одно натуральное число n (2 ≤ n ≤ 2·10⁹).
Выходные данные#
Одно число — минимальный делитель.
Примеры#
| Ввод | Вывод |
|---|---|
15 |
3 |
16 |
2 |
17 |
17 |
Совет
Проверяйте делители, пока
i * i <= n. Если делитель не нашёлся, число простое и ответ — самоn. Дляnоколо 2·10⁹ произведениеi * iможет не поместиться вint— объявитеiкакlong long.
Задача 5. Синус через ряд Тейлора#
Условие#
Вычислите sin(x) с помощью ряда Тейлора:
sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + ...
Суммируйте члены ряда, пока модуль очередного члена больше 10⁻⁶. Оформите вычисление в виде функции double taylorSine(double x). Пользоваться функцией sin из <cmath> нельзя.
Входные данные#
Одно вещественное число x (|x| ≤ 10) — угол в радианах.
Выходные данные#
Значение sin(x) с шестью знаками после запятой.
Примеры#
| Ввод | Вывод |
|---|---|
0 |
0.000000 |
1.5707963 |
1.000000 |
1 |
0.841471 |
Совет
Не считайте факториал и степень заново для каждого члена. Следующий член получается из предыдущего:
term = -term * x * x / ((2 * n) * (2 * n + 1)), гдеn— номер шага. Для вывода используйтеfixed << setprecision(6).