Согласие на обработку персональных данных.

11.02.2021
Новые видео и статья Как найти элемент в документе HTML.

02.02.2021
Новый выпуск журнала Автоматизация и Программирование.

25.01.2021
Новая задача Найти количество нулей в двоичном числе.

10.01.2021
Новый выпуск журнала Автоматизация и Программирование.

08.12.2020
Новые видео и статья Таблицы в HTML.



Раздел: Задачи / Простейшие /

Найти количество нулей в двоичном числе

Условие задачи 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;

Эта функция более универсальна, чем требуют условия задачи - она может подсчитать количество любых символов (с учётом регистра).

Думаю, что какие-то дополнительные пояснения давать нет смысла, потому как всё достаточно просто и описано в комментариях. Осталось привести примеры программ на Паскале и С++.

Решение задачи 2.145 на Паскале
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.
Решение задачи 2.145 на C++
#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;
}

Ну а на экране вывод программы будет выглядеть примерно так:

Найти количество нулей в двоичном числе

ВНИМАНИЕ! Если вам что-то осталось непонятно, то советую почитать книги “Основы программирования” и “Основы С++”.


Основы C++ Основы C++

C++ - это один из самых популярных языков программирования. Не важно, на каком языке программируете лично вы. Но, если вы хотя бы в общих чертах не знаете С++, то это большой пробел в вашем образовании, который надо восполнить как можно быстрее... Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика