/
AirLexa
/
03
Обзор
Документация
Войти
/
AirLexa
/
03
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_05/Task_1/Task_1.cpp
52 строки
2 KB
AirLexa
загрузка Lesson_05/Task_1/Task_1.cpp
19 янв 2026, 21:54
Верифицирован
19 янв 2026, 21:54
d8efc80
Код
Авторство
О чём код?
#include <iostream> #include <windows.h> int get_uroven(int i) { // так как каждый уровень увеличивает детей в 2 раза, то номер // уровня, это степень двойки от порядкового номера элемента // т.е. нам достаточно узнать место старшего бита в числе i++; // счет идет от нуля - который корневой элемент int res = 0; // счетчик смещений вправо for (res; i >>= 1; res++); // смещаем вправо биты по одному разряду // пока их не останется (0 это false) return res; // количество таких смещений и будет номер старшего бита // он же и степень двойки } void print_pyramid(int nums[], int size) { if (size == 0) { std::cout << "Массив пустой!\n"; return; } std::cout << "Исходный массив:"; for (int i = 0; i < size; i++) // выводим исходный массив std::cout << ' ' << nums[i]; std::cout << "\nПирамида:\n"; std::cout << "0 корень " << nums[0] << std::endl; // корневой элемент for (int i = 0; i < size; i++) { int n = 2 * i + 1; // номер левого ребенка if (n >= size) break; // если он за пределами массива, то закончили std::cout << get_uroven(n) << " левый(" << nums[i] << ") " << nums[n] << std::endl; if (++n >= size) break; // номер правого ребенка на 1 больше левого std::cout << get_uroven(n) << " правый(" << nums[i] << ") " << nums[n] << std::endl; } std::cout << std::endl; } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int nums_1[] = { 1, 3, 6, 5, 9, 8 }; print_pyramid(nums_1, sizeof(nums_1) / sizeof(nums_1[0])); int nums_2[] = { 94, 67, 18, 44, 55, 12, 6, 42 }; print_pyramid(nums_2, sizeof(nums_2) / sizeof(nums_2[0])); int nums_3[] = { 16, 11, 9, 10, 5, 6, 8, 1, 2, 4 }; print_pyramid(nums_3, sizeof(nums_3) / sizeof(nums_3[0])); }