Завдання 5 Дедлайн 20 листопада

Користувач задає додатне число number, потрібно визначити, чи є воно степенем двійки, і вивести відповідне повідомлення:

  • number is not a power of 2”, якщо number не є степенем двійки.
  • number is 2 to the power of n”, якщо number є n-им степенем двійки.

Необхідно додати цикл після //PUT YOUR CODE HERE.
На розв’язок накладаються обмеження:

  • Не можна додавати код перед чи після циклу.
  • Цикл не повинен мати вкладених циклів.
#include <iostream>

int main() {
    unsigned number;
    std::cout << "Enter the number: ";
    std::cin >> number;
    // PUT YOUR CODE HERE
    return 0;
}

Приклад діалогу
Enter the number: 1000
1000 is not a power of 2

Відповідь

З умови задачі зрозуміло, що потрібно визначити степінь двійки, а для цього потрібна додаткова змінна (n, щоб відповідати умові задачі). Враховуючи обмеження, потрібно використати цикл for, бо тільки він дозволяє оголошувати змінні (параметри циклу). Змінні, оголошені в тілі циклу, не є корисними в даному випадку, бо вони не зберігають стан між ітераціями (“переоголошуються”). Щоб реалізувати перевірку, потрібна ще одна змінна p — “2 в степені n”. Тут цикл for також є корисним, бо в ньому можна оголошувати більше ніж одну змінну, і мати більше ніж один вираз в кроці циклу.
Логіка циклу наступна:

  1. Якщо number рівне p, то завершити перевірку. Інакше — перейти до кроку 2.
  2. Якщо number менше за p, то воно точно не є степенем двійки, потрібно завершити перевірку. Інакше — перейти до кроку 3.
  3. Збільшити n на 1, а p домножити на 2, перейти до кроку 1.
#include <iostream>

int main() {
    unsigned number;
    std::cout << "Enter the number: ";
    std::cin >> number;
    // PUT YOUR CODE HERE
    // 1. Оголошуємо n (поточна степінь двійки), та p ("2 в степені n").
    // 2. Цикл "нескінченний" (умова true), з циклу виходимо використовуючи break.
    // 3. Кроки - збільшити степінь n на 1, і домножити p на 2. Їх завжди можна
    // винести в тіло циклу, якщо вони більш складні.
    for (unsigned n = 0, p = 1; true; ++n, p *= 2) {
        // Потрібно перевірити, чи number є рівним p, і завершити перевірку, якщо так.
        if (number == p) {
            std::cout << number << " is 2 to the power of " << n << std::endl;
            break;
        }
        // Якщо number менше p, то воно не є степенем 2, бо далі p лише зростатиме.
        if (number < p) {
            std::cout << number << " is not a power of 2" << std::endl;
            break;
        }
        // number більше p, отже ще може бути рівним якомусь більшому степеню 2.
    }
    return 0;
}

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 1 ГБ. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Перетащите файл сюда