Вывести числа из диапазона от n до m, в двоичном представлении которых ровно k разрядов установленных в «01» - C (СИ)
Формулировка задачи:
Доброго времени суток. Есть задача:Вывести числа из диапазона от n до m , в двоичном представлении которых ровно k разрядов установленных в «01». Число k, n, m вводится пользователем. Использовать операции сдвига и побитового умножения.
Объясните с чего начать
Более простые задачи типа " выведете из диапазона те числа,в которых количество единиц (в двоичном представлении) нечетное" решаю, а в этой тупняк. Не понимаю с чего начать и что обозначает фраза "ровно k разрядов установленных в «01»"
Заранее спасибо
Решение задачи: «Вывести числа из диапазона от n до m, в двоичном представлении которых ровно k разрядов установленных в «01»»
textual
Листинг программы
#include<stdio.h>
int main(void)
{
int n,m,k,cnt,i,d;
printf("%s","Enter n:");
scanf("%i",&n);
printf("%s","Enter m:");
scanf("%i",&m);
printf("%s","Enter k:");
scanf("%i",&k);
for(i=n;i<m+1;i++)
{
cnt=0;
d=i;
while(d!=0)
{
if(d&1) cnt++;
d=d>>1;
}
if(cnt==k) printf("%i\n",i);
}
getchar();
return 0;
}
Объяснение кода листинга программы
В этом коде:
- Вводятся значения переменных n, m, k с помощью функции scanf().
- Создается цикл от n до m с шагом 1, то есть с 10-ичной системой исчисления это будет диапазон от n до m включительно.
- Внутри цикла инициализируется счётчик cnt = 0, а также переменная d, которая итерируется от i до 0 (для справа налево).
- Внутри цикла в то время как d больше 0 (то есть пока в числе d есть разряды от 1 до k) с помощью операции побитового И (AND) проверяется, является ли k-й разряд числа d равным 1. Если это так, то значение счётчика cnt увеличивается на 1.
- Внутри цикла переменная d сдвигается вправо на 1 разряд (d = d >> 1).
- Цикл продолжается до тех пор, пока в числе d не останется 0.
- Если количество разрядов, равных 1, равно k, то число i выводится на экран с помощью функции printf().
- После окончания цикла запрашивается ввод (getchar()) и программа завершается, возвращая 0.