С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Определить, является ли число степенью двойки - C++
Такая проблема: в проге мне нужно задать количество чисел которые я введу (т.е создать массив под них), потом ввести числа и оно должно мне...

Определить, является ли число степенью двойки - C++
По заданному положительному числу n < 2^64 определить, является ли оно степенью двойки. Решение должно иметь сложность O(1). 1 ...

Определить, является ли число целой степенью двойки - C++
Задано целое положительное число.Определить, является ли оно целой степенью двойки. Вход 1 16 1028 1024 Выход Yes

Определить, является ли число степенью двойки (циклы) - C++
Вводится число. Определить, является ли оно степенью двойки. ( с помощью цикла) Думала примерно так, но знаю не правильно ...

Вводится число. Определить, является ли оно степенью двойки. - C++
Вводится число. Определить, является ли оно степенью двойки. Необходимо использовать Операторы цикла ! Спасибо за внимание!

Определить, является ли заданное число точной степенью двойки - C++
Дано натуральное число N. Вывести слово YES, если число N является точной степенью двойки, или слово NO в противном случае. При решении...

14
MikeSoft
Эксперт С++
3802 / 1778 / 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;
}
О том, как прикрутить чтение из файла, материала уйма. Пару строчек кода.
1
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,247
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;
 
}
0
diagon
Higher
1932 / 1198 / 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;
}
1
enk
46 / 45 / 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
0
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 неправильно и воспринимается как степень двойки.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,247
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 запросто
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.06.2012, 06:39 #8
Цитата Сообщение от ValeryS Посмотреть сообщение
n =1
Ну так 1 = 2^0
Для 0 такой алгоритм не сработает, нужно дополнительное условие вводить.
1
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
20.06.2012, 07:21 #9
Ещё проще. Надо сосчитать единицы в двоичном коде числа, который есть его внутреннее представление.

Добавлено через 29 секунд
Цитата Сообщение от diagon Посмотреть сообщение
Для 0 такой алгоритм не сработает, нужно дополнительное условие вводить.
А с каких пор 0 стал степенью двойки?
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,247
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)
0
Olga_
842 / 184 / 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;    
}
0
Dima2282
0 / 0 / 0
Регистрация: 06.04.2015
Сообщений: 30
12.04.2015, 02:35 #12
а только используя while это можно написать? просто нашел задачи под темой цикла while и там такое задание стоит вторым номером
http://informatics.mccme.ru/mod/book/view.php?id=550
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,247
12.04.2015, 19:04 #13
Цитата Сообщение от Dima2282 Посмотреть сообщение
используя while это можно написать?
тему то читал? первые два сообщения и есть решение с while
0
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));
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 00:37 #15
MaxKrivich, чем вариант x & (x - 1) == 0 хуже?
0
20.06.2015, 00:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2015, 00:37
Привет! Вот еще темы с ответами:

Является ли число степенью двойки? - C++
Вводится число. Напечатать YES, если оно является степенью двойки, NO - иначе.

Является ли число степенью двойки - C++
Дано натуральное число n. Определите, является ли оно степенью числа 2, и выведете слово YES если является,и выведите слово NO если не...

Является ли число степенью двойки - C++
Условие: Входные данные Входной файл INPUT.TXT содержит единственное целое число N, не превосходящее 10000 по абсолютной величине. ...

Проверить, является ли число степенью двойки - C++
Бьюсь с самого утра все никак. Условия Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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