Раздел: Задачи / Простейшие /
Найти количество нулей в двоичном числе
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
Условие задачи 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; }
Ну а на экране вывод программы будет выглядеть примерно так:
ВНИМАНИЕ! Если вам что-то осталось непонятно, то советую почитать книги “Основы программирования” и “Основы С++”.
Вступить в группу "Основы программирования"
Подписаться на канал в РУТУБ Подписаться на Дзен-канал Подписаться на рассылки по программированию |
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |