Вывести все десятичные числа, в двоичной записи которых число нулей на 2 превосходит число единиц - C (СИ)
Формулировка задачи:
Доброго времени суток!
Долго уже мучаюсь с задачкой, для которой необходимо написать код на Си, чтобы "вывести все десятичные числа A (300<А<800), в двоичной записи которых число нулей на 2 превосходит число единиц". Предполагается, что все числа при выполнении программы, удовлетворяющие условию, должны будут вывестись сами (т.е. не надо вводить число с клавиатуры, чтобы проверить подходит ли оно заданному условию!)
Буду благодарна, если сможете помочь! Заранее спасибо
Решение задачи: «Вывести все десятичные числа, в двоичной записи которых число нулей на 2 превосходит число единиц»
textual
Листинг программы
#include <stdio.h> #define LO (300) #define HI (800) char * binstr(int n) { static char buf[BUFSIZ]; char * head, * tail, tmp; for ( tail = buf; n; n >>= 1 ) *tail++ = '0' + ( n & 1 ); *tail = '\0'; for ( head = buf, tail -= 1; head < tail; ++head, --tail ) { tmp = *head; *head = *tail; *tail = tmp; } return buf; } int main(void) { int n, allbits, setbits, i; for ( i = LO; i < HI; ++i ) { for ( n = i, allbits = setbits = 0; n; n >>= 1, allbits += 1 ) setbits += n & 1; if ( allbits - setbits == setbits + 2 ) printf("%d => %s\n", i, binstr(i)); } return 0; }
Объяснение кода листинга программы
- Подключаем стандартную библиотеку для работы с консолью.
- Определяем границы диапазона для перебора чисел.
- Создаём функцию binstr(int n), которая преобразует десятичное число n в двоичную строку, записывая её в статическую буферную строку buf.
- В функции main() перебираем числа от LO до HI (включительно).
- Для каждого числа вычисляем количество всех бит (allbits) и количество установленных бит (setbits).
- Если количество нулей на 2 больше, чем количество единиц, то выводим число и его двоичное представление.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д