JustCaptain kod-buduschego
7efceb421dbc5c7b77700ed9dbec228ce6d15358
Перейти к файлу
Код
kod-buduschego C++Тема 1.5. Функции и основы декомпозиции программЗадачиНеобязательные задачи.md
anc add theme 1.5, 1.6 7efceb4 4 дня назад
Необязательные задачи.md

⭐ Необязательные задачи#

Дополнительная тренировка по теме. Решайте, если обязательные задачи уже сданы.


Задача 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).