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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 101, средняя оценка - 4.73
varkich
0 / 0 / 0
Регистрация: 16.04.2012
Сообщений: 18
19.06.2012, 20:08     Определить, является ли данное число степенью двойки #1
Является ли данное число степенью двойки?
Формат входных данных
Вводится число.
Формат выходных данных
Напечатать 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     Определить, является ли данное число степенью двойки
Посмотрите здесь:

Определить является ли число к степенью 3 C++
C++ Выведите YES, если число N является точной степенью двойки, или NO в противном случае.(Рекурсия)
C++ Определить, является ли натуральное число k степенью числа
Создайте логическую функцию, которая принимает в качестве аргумента целое число и проверяет, является ли оно степенью двойки C++
Вводится число. Определить, является ли оно степенью двойки. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3781 / 1765 / 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
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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
 Аватар для diagon
1920 / 1186 / 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
 Аватар для 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
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.06.2012, 06:39     Определить, является ли данное число степенью двойки #8
Цитата Сообщение от ValeryS Посмотреть сообщение
n =1
Ну так 1 = 2^0
Для 0 такой алгоритм не сработает, нужно дополнительное условие вводить.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.06.2012, 07:21     Определить, является ли данное число степенью двойки #9
Ещё проще. Надо сосчитать единицы в двоичном коде числа, который есть его внутреннее представление.

Добавлено через 29 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Для 0 такой алгоритм не сработает, нужно дополнительное условие вводить.
А с каких пор 0 стал степенью двойки?
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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_
 Аватар для 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
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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++ Является ли число степенью двойки

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

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

Текущее время: 04:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru