Раздел: Задачи / Простейшие /
Найти количество нулей в двоичном числе
|
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
Условие задачи 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), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |