Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 101, средняя оценка - 4.73
varkich
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 18
#1

Определить, является ли данное число степенью двойки - C++

19.06.2012, 20:08. Просмотров 15162. Ответов 14
Метки нет (Все метки)

Является ли данное число степенью двойки?
Формат входных данных
Вводится число.
Формат выходных данных
Напечатать YES, если оно является степенью двойки, Напечатать YES, если оно является степенью двойки, NO – иначе.
Примеры
input.txt output.txt
8 YES
22 NO
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2012, 20:08     Определить, является ли данное число степенью двойки
Посмотрите здесь:

C++ Выведите YES, если число N является точной степенью двойки, или NO в противном случае.(Рекурсия)
Создайте логическую функцию, которая принимает в качестве аргумента целое число и проверяет, является ли оно степенью двойки C++
Вводится число. Определить, является ли оно степенью двойки. C++
C++ Является ли число степенью двойки?
C++ Является ли число степенью двойки
C++ Является ли заданное натуральное число степенью двойки
Является ли число степенью двойки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MikeSoft
Эксперт С++
3790 / 1772 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
20.06.2012, 02:48     Определить, является ли данное число степенью двойки #2
varkich, а что у вас не получается?
Определить, является ли число степенью двойки, очень просто:
C++
1
2
3
4
5
6
7
8
9
bool PowerOfTwo(int &Value)
{
  int InitValue = 1;
  while (InitValue < Value)
    InitValue *= 2;
  if (InitValue == Value)
    return true;
  return false;
}
О том, как прикрутить чтение из файла, материала уйма. Пару строчек кода.
ValeryS
Модератор
6516 / 4982 / 460
Регистрация: 14.02.2011
Сообщений: 16,504
20.06.2012, 03:14     Определить, является ли данное число степенью двойки #3
Цитата Сообщение от MikeSoft Посмотреть сообщение
число степенью двойки, очень просто:
даже еще проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool VerifyDecimal(int value)
{
  if(value<=0)
    return false; 
while((value%2)==0)
{
 
 if((value/=2)==1)
    return true;
}
return false;
 
}
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.06.2012, 04:48     Определить, является ли данное число степенью двойки #4
Где-то видел примерно такой код
C++
1
2
3
4
bool is_exp_of_2(int n)
{
    return ( n & (n - 1) ) == 0;
}
enk
45 / 44 / 7
Регистрация: 16.06.2012
Сообщений: 177
20.06.2012, 05:17     Определить, является ли данное число степенью двойки #5
Цитата Сообщение от diagon Посмотреть сообщение
Где-то видел примерно такой код
C++
1
2
3
4
bool is_exp_of_2(int n)
{
    return ( n & (n - 1) ) == 0;
}
Работает, если степень <= 30.
C++
1
2
is_exp_of_2(pow(2, 31)); // 0
is_exp_of_2(8589934591); // 1
Xorboo
7 / 7 / 0
Регистрация: 16.12.2010
Сообщений: 23
20.06.2012, 06:11     Определить, является ли данное число степенью двойки #6
Цитата Сообщение от enk Посмотреть сообщение
Работает, если степень <= 30.
C++
1
2
is_exp_of_2(pow(2, 31)); // 0
is_exp_of_2(8589934591); // 1
А как вы собираетесь 2^31 записать в int? Для float естественно не работает, там представление числа совсем другое. По этой же причине 2^33-1 записывается в int неправильно и воспринимается как степень двойки.
ValeryS
Модератор
6516 / 4982 / 460
Регистрация: 14.02.2011
Сообщений: 16,504
20.06.2012, 06:24     Определить, является ли данное число степенью двойки #7
Цитата Сообщение от diagon Посмотреть сообщение
Где-то видел примерно такой код
C++
1
2
3
4
bool is_exp_of_2(int n)
{
 return ( n & (n - 1) ) == 0;
}
n =1 и
1&0==0 истина
ну если представить что единица это 2 в 0 то можно так сказать
ну а 0
0&0xFFFFFFFF тоже рано нулю но нуль то не степень двойки

Добавлено через 3 минуты
Цитата Сообщение от Xorboo Посмотреть сообщение
А как вы собираетесь 2^31 записать в int?
в int нельзя а в unsigned int запросто
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.06.2012, 06:39     Определить, является ли данное число степенью двойки #8
Цитата Сообщение от ValeryS Посмотреть сообщение
n =1
Ну так 1 = 2^0
Для 0 такой алгоритм не сработает, нужно дополнительное условие вводить.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.06.2012, 07:21     Определить, является ли данное число степенью двойки #9
Ещё проще. Надо сосчитать единицы в двоичном коде числа, который есть его внутреннее представление.

Добавлено через 29 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Для 0 такой алгоритм не сработает, нужно дополнительное условие вводить.
А с каких пор 0 стал степенью двойки?
ValeryS
Модератор
6516 / 4982 / 460
Регистрация: 14.02.2011
Сообщений: 16,504
20.06.2012, 10:27     Определить, является ли данное число степенью двойки #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Ещё проще. Надо сосчитать единицы в двоичном коде числа, который есть его внутреннее представление.
на бумаге проще, а на языке?
опять цикл?
Цитата Сообщение от taras atavin Посмотреть сообщение
А с каких пор 0 стал степенью двойки?
а ни с какой
но вот этот код подумает что да
C++
1
2
3
4
bool is_exp_of_2(int n)
{
    return ( n & (n - 1) ) == 0;
}
Цитата Сообщение от Xorboo Посмотреть сообщение
По этой же причине 2^33-1 записывается в int неправильно
вообще то там идет округление и 2^33-1==2^33 (почему и не пользуются плавающими в бухгалтерии)

Добавлено через 5 минут
diagon, слушай а ведь отрицательные не могут быть степенью двойки
может лучше использовать
bool is_exp_of_2(unsigned int n)
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
20.06.2012, 10:40     Определить, является ли данное число степенью двойки #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Ещё проще. Надо сосчитать единицы в двоичном коде числа, который есть его внутреннее представление.
В алгоритме diagon это и учитывается с помощью битовой операции &. Простой и красивый алгоритм без лишних циклов. Работает только с положительными числами. для 0 дополнительную проверку нужно.

Цитата Сообщение от ValeryS Посмотреть сообщение
а ведь отрицательные не могут быть степенью двойки
да, верно, поэтому вот алгоритм:
C
1
2
3
4
int deg_of_2(long x)
{
    return (x <= 0) ? 0 : (x & (x-1)) == 0;    
}
Dima2282
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 31
12.04.2015, 02:35     Определить, является ли данное число степенью двойки #12
а только используя while это можно написать? просто нашел задачи под темой цикла while и там такое задание стоит вторым номером
http://informatics.mccme.ru/mod/book/view.php?id=550
ValeryS
Модератор
6516 / 4982 / 460
Регистрация: 14.02.2011
Сообщений: 16,504
12.04.2015, 19:04     Определить, является ли данное число степенью двойки #13
Цитата Сообщение от Dima2282 Посмотреть сообщение
используя while это можно написать?
тему то читал? первые два сообщения и есть решение с while
MaxKrivich
51 / 0 / 1
Регистрация: 08.12.2014
Сообщений: 6
20.06.2015, 00:03     Определить, является ли данное число степенью двойки #14
return x && ((x & (x - 1)) == 0);

Добавлено через 6 минут
или еще
return ((x != 0) && ((x & (~x + 1)) == x));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2015, 00:37     Определить, является ли данное число степенью двойки
Еще ссылки по теме:

C++ Определить, является ли число степенью двойки (циклы)
C++ Является ли натуральное число точной степенью двойки
C++ Проверить, является ли число степенью двойки
Определить, является ли число целой степенью двойки C++
C++ Определить, является ли число степенью двойки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 00:37     Определить, является ли данное число степенью двойки #15
MaxKrivich, чем вариант x & (x - 1) == 0 хуже?
Yandex
Объявления
20.06.2015, 00:37     Определить, является ли данное число степенью двойки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru