Вывести числа из диапазона от 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д