Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2013, 18:39   #1
dragodar
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 51
По умолчанию вывод числа в котором все единичные разряды идут подряд

добрый день всем форумчанам. попытаюсь излагатся поконкретней мне в универе поставили задачу:
вывести все числа(предварительно переделав их в бинарный код) в которых все единичные разряды идут подряд при том эти числа меньше либо равны заданнаму нами числу. Пример дано число 28 в десятичной системе и числа соответствующее требованиям это 11100 (в двоичной)
01110 - это 14 , 00111 это число 7 , 01111 это число 13, 00011 это число 3 и 00001 это число 1
я сделал небольшой набросок хотя бы для 1 числа но и тут запутался
Код:
void search(int N)
{for(;N;N>>=1)
if(N&1)
//и вот тут я незнаю что писать(переделывал алгоритм с подсчётом единиц в числе)
}
прошу о вашей помощи!
dragodar вне форума Ответить с цитированием
Старый 02.11.2013, 19:14   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не знаю, как это записывается в C++,
но Вам нужно воспользоваться операциями бинарного сдвига числа вправо: >>
и логического И (операция "AND"): &&

алгоритм такой - ( число не равно нулю) выделяем с помощью (N && 1) последний бит и сдвигаем вправо, ждём 1 в младшем разряде:
while ((N &&1) != 1) {N = N >> 1);
После этого сдвигаем вправо до первого нуля. если при этом число целиком равно нулю - тогда условие выполнилось, в числе единицы идут подряд, иначе, если число не равно нулю - значит, не подходит число под выборку.

Последний раз редактировалось Serge_Bliznykov; 02.11.2013 в 19:16.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.11.2013, 19:20   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Думаю что нужно что-то вроде такого:
Код:
int k=1,e=1;
for(int i=1;i<32;i++){
 v=k;
 for(int j=e;j<32;j++){
  printf("%d\t",v);
  v=v<<1;
 }
 k=k<<1; 
 k=k+1;
 e++
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2013, 21:29   #4
dragodar
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 51
По умолчанию

попробовал написать но выдаёт всякую белиберду!!! вот код
Код:
#include<iostream>;
#include<stdio.h>;
using namespace :: std;
int main()
{
	int n,number;
	cout<<"input number: ";
	cin>>number;
	number=n;
	do {
	while((n&1)!=1){n=n>>1;}// идём до первой единицы
	while((n&1)!=0)               // идём до 0
	{
		n=n>>1;
		if(n>>1=1){break;}      //если после 0 идёт 1 то стоп процесс
		else{cout<<number;}   //если всё чётко то пишем нашу цифру
	}
	}
	while(n>0);
	return 0;
}
если есть какие нибудь соображения подскажите пожалуйста

Последний раз редактировалось dragodar; 02.11.2013 в 21:33.
dragodar вне форума Ответить с цитированием
Старый 02.11.2013, 22:56   #5
dragodar
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 51
По умолчанию вывод числа в котором все единичные разряды идут подряд

добрый день всем форумчанам. попытаюсь излагатся поконкретней мне в универе поставили задачу:
вывести все числа(предварительно переделав их в бинарный код) в которых все единичные разряды идут подряд при том эти числа меньше либо равны заданнаму нами числу. Пример дано число 28 в десятичной системе и числа соответствующее требованиям это 11100 (в двоичной)
01110 - это 14 , 00111 это число 7 , 01111 это число 13, 00011 это число 3 и 00001 это число 1
попробовал написать хотя бы для 1 числа(просто выводит число если оно соответствует требованиям) но выдаёт всякую белиберду!!! вот код
Код:
#include<iostream>;
#include<stdio.h>;
using namespace :: std;
int main()
{
	int n,number;
	cout<<"input number: ";
	cin>>number;
	number=n;
	do {
	while((n&1)!=1){n=n>>1;}// идём до первой единицы
	while((n&1)!=0)               // идём до 0
	{
		n=n>>1;
		if(n>>1=1){break;}      //если после 0 идёт 1 то стоп процесс
		else{cout<<number;}   //если всё чётко то пишем нашу цифру
	}
	}
	while(n>0);
	return 0;
}
если есть какие нибудь соображения подскажите пожалуйста
dragodar вне форума Ответить с цитированием
Старый 02.11.2013, 23:02   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну уж, как минимум вместо
Цитата:
Код:
cin>>number;
number=n;
должно быть:
Код:
cin>>number;
n = number;
но мне и дальнейший ваш код не нравится.. что-то слишком много циклов...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.11.2013, 23:33   #7
dragodar
Пользователь
 
Регистрация: 30.09.2012
Сообщений: 51
По умолчанию

насчёт n=number я согласен это опечатка в проге я давно переделал а вот дальше незнаю по сути как я понял
1) мне надо сделать проверку на числа до первой единицы
2) потом проверку на последовательность единиц(подряд)
3)потом проверка на то есть ли нули после ряда единиц (по моему через if)
4)а последняя проверка по сути проверка есть ли единица после 3 проверки(тоже по моему через if)
в итоге циклов у меня мало( но как сделать незнаю!

Последний раз редактировалось dragodar; 03.11.2013 в 00:09.
dragodar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить сумму цифр во второй половине числа (младшие разряды). mirqa Помощь студентам 1 15.06.2012 09:08
Вывод списка символов справа налево 5 раз подряд и исключить вывод цифр Gareek Помощь студентам 2 23.12.2011 21:41
Вывести номер столбца в котором все элементы отрицательные. Jully19 Помощь студентам 7 22.06.2011 19:34
Выделить из числа значимые восьмиричные разряды green_ Помощь студентам 2 28.10.2009 19:43