Как удалить пустую папку в Паскале
Обязательно ли в JavaScript использовать точку с запятой для обозначения конца инструкции
Примеры работы фрилансера
Специальные символы в языках программирования С/С++ и некоторых других
Как в Паскале вставить данные в строку или в динамический массив

Как стать успешным фрилансером
Раздел: Задачи / Простейшие /
Найти количество нулей в двоичном числе
![]() |
|
Условие задачи 2.145
Задача 2.145
Дан массив А, состоящий из N натуральных чисел. Вывести на экран количество чисел, которые в двоичном представлении содержат два нуля.
Представляю вашему вниманию очередную задачу по программированию. Условие, надеюсь, вы прочитали. Ну а теперь попробуйте сначала решить задачу самостоятельно, а потом посмотрите мои решения.
Итак, сначала нам нужен массив натуральных чисел. В этот раз я не буду заморачиваться со случайными значениями, а просто заполню массив некоторым количеством чисел от 0 до 15.
Потом нам надо перебрать весь этот массив и значение каждого из его элементов преобразовать в двоичное число в строковом представлении, ну а потом уже посчитать количество нулей в этой строке.
Преобразовать число в строку, содержащую его двоичное представление, можно с помощью функции binStr. Ну а для подсчёта нулей в этой строке мы создадим свою функцию:
//******************************************************************* // Ищет указанный символ в строке // ВХОД: s - строка, ch - символ // ВЫХОД: количество найденных символов //******************************************************************* function FindSimbolInStr(s : string; ch : Char) : WORD; var i, n : WORD; begin n := 0; for i := 1 to Length(s) do if s[i] = ch then Inc(n); Result := n; end;
Эта функция более универсальна, чем требуют условия задачи - она может подсчитать количество любых символов (с учётом регистра).
Думаю, что какие-то дополнительные пояснения давать нет смысла, потому как всё достаточно просто и описано в комментариях. Осталось привести примеры программ на Паскале и С++.
program mytask; //******************************************************************* // КОНСТАНТЫ //******************************************************************* const MAX_NUM = 16; //Наибольшее количество числе в массиве //******************************************************************* // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //******************************************************************* var i : WORD; X : WORD; A : array[1..MAX_NUM] of WORD; st : string; //******************************************************************* // ФУНКЦИИ И ПРОЦЕДУРЫ //******************************************************************* //******************************************************************* // Ищет указанный символ в строке // ВХОД: s - строка, ch - символ // ВЫХОД: количество найденных символов //******************************************************************* function FindSimbolInStr(s : string; ch : Char) : WORD; var i, n : WORD; begin n := 0; for i := 1 to Length(s) do if s[i] = ch then Inc(n); Result := n; end; //******************************************************************* // ОСНОВНАЯ ПРОГРАММА //******************************************************************* begin X := 0; //Заполнить массив числами for i := 1 to MAX_NUM do begin A[i] := i - 1; Write(A[i]:3); end; //Решить задачу WriteLn(#10#13#10#13'Numbers where there are exactly two zeros:'); for i := 1 to MAX_NUM do begin st := binStr(A[i], 4); if FindSimbolInStr(st, '0') = 2 then begin Write(A[i]:3, ' (', st, ')'); Inc(X); end; end; WriteLn(#10#13#10#13'Number of numbers with two zeros: ', X); //Вывести числа, где не два нуля WriteLn(#10#13'Numbers where there are NOT two zeros:'); for i := 1 to MAX_NUM do begin st := binStr(A[i], 4); if FindSimbolInStr(st, '0') <> 2 then Write(A[i]:3, ' (', st, ')'); end; WriteLn(#10#13#10#13'The end. Press ENTER...'); ReadLn; end.
#include <cstdlib> #include <iostream> #include <bitset> using namespace std; //******************************************************************* // КОНСТАНТЫ //******************************************************************* //Наибольшее количество чисел в массиве const unsigned int MAX_NUM = 16; //******************************************************************* // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //******************************************************************* unsigned int i; unsigned int X; unsigned int A[MAX_NUM]; string st; //******************************************************************* // Ищет указанный символ в строке // ВХОД: s - строка, ch - символ // ВЫХОД: количество найденных символов //******************************************************************* unsigned int FindSimbolInStr(string s, char ch) { unsigned int i, n = 0; for (i = 0; i < s.length(); i++) if (st[i] == ch) n++; return n; } //******************************************************************* // ОСНОВНАЯ ПРОГРАММА //******************************************************************* int main(int argc, char *argv[]) { X = 0; //Заполнить массив числами for (i = 0; i < MAX_NUM; i++) { A[i] = i; cout.width(3); //Ширина поля вывода 3 знака cout << A[i]; } //Решить задачу cout << endl << endl << "Numbers where there are exactly two zeros:" << endl; for (i = 0; i < MAX_NUM; i++) { st = bitset<4>(A[i]).to_string(); if (FindSimbolInStr(st, '0') == 2) { cout.width(3); cout << A[i] << "(" << st << ")"; X++; } } //Вывести числа, где не два нуля cout << endl << endl << "Number of numbers with two zeros: " << X << endl; for (i = 0; i < MAX_NUM; i++) { st = bitset<4>(A[i]).to_string(); if (FindSimbolInStr(st, '0') != 2) { cout.width(3); cout << A[i] << "(" << st << ")"; } } cout << endl; system("PAUSE"); return EXIT_SUCCESS; }
Ну а на экране вывод программы будет выглядеть примерно так:

ВНИМАНИЕ! Если вам что-то осталось непонятно, то советую почитать книги “Основы программирования” и “Основы С++”.
Подписаться на канал в YouTube
Вступить в группу "Основы программирования" Подписаться на рассылки по программированию |
![]() |
Основы C++
C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее... |