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

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

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

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

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

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

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


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

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