Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2013, 04:03   #1
Ruslan M
Новичок
Джуниор
 
Регистрация: 09.07.2013
Сообщений: 1
По умолчанию Цифровой массив

Помогите пожалуйста надо написать прогу на паскале: Дан цифровой массив , посчитать сколько двоичных единиц содержит каждое число
Ruslan M вне форума Ответить с цитированием
Старый 09.07.2013, 08:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Написать код ввода массива конечно не сможешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.07.2013, 10:40   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
посчитать сколько двоичных единиц содержит каждое число
Интересненько.. Если отойти от банального перевода в двоичное число, то, наверное, можно получить что-то очень красивое..

Ну пока из идей : Делить на 16 и брать из константного массива кол-во единичек.
Код:
const
	a : array [0..15] of Integer = (0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3,
	                               2, 3, 3, 4);
	
var
	
	n, t, count : Integer;

begin
	ReadLn (n);
	count := 0;
	
	while n > 0 do begin
		t := n mod 16;
		n := n div 16;
		Inc (count, a[t])
	end;
	
	WriteLn (count)
end.
Poma][a вне форума Ответить с цитированием
Старый 10.07.2013, 21:38   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

Ну а если число < 0?
В условии об этом ничего ...

Можно просто посчитать биты, которые установлены в единицу.
Например:

Код:
const n = 10;
type Tmas = array[1..n] of integer;
var a, b : Tmas;
    i, m : integer;
       s : word;
begin
   randomize();
   for i := 1 to n do
      a[i] := random(100) - 50;

   for i := 1 to n do begin
      s := 1;
      b[i] := a[i] and s;
      for m := 1 to 15 do begin
         s := s shl 1;
         if ((a[i] and s) > 0) then
            b[i] := b[i] + 1;
      end;
   end;
end.


Так, для баловства ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.07.2013, 21:50   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Ну а если число < 0?
Каюсь, пропустил..
Цитата:
Можно просто посчитать биты, которые установлены в единицу.
А можно прокомментировать код?
После этого цикла (for m := 1 to 15 do begin) я перестал понимать что к чему..
Poma][a вне форума Ответить с цитированием
Старый 10.07.2013, 22:34   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

Цитата:
А можно прокомментировать код?
Да.
Код:
for i := 1 to n do begin {цикл по всем элементам массива}
      s := 1;            {нач. знач. маски - 1 - соответствует мл. биту}
      b[i] := a[i] and s;  {проверяем наличие единицы в мл. бите}
                            {т.к. это либо единица, либо ноль, то сразу}
                            {сохраняем в массиве для подсчета единиц}
      for m := 1 to 15 do begin {цикл по битам числа}
         s := s shl 1;  {сдвиг значения маски влево на одну позицию:}
                        {т.о. получаем положение единицы во втором бите,}
                        {третьем и т.д.}
         if ((a[i] and s) > 0) then {операция И для конкретного бита}
                                    {0010001 AND 0010000 = 0010000}
            b[i] := b[i] + 1;       {подсчитываем единицы}
      end;
   end;


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.07.2013, 23:23   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ага. Спасибо! До меня "дошло".

Проверяем первый бит и остальные 15.
Долго не мог понять фишку с shl-ом.. давно не пользовался и упорно путал право_с_лево.
Еще раз спасибо!
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
цифровой счетчик mixon-21 Помощь студентам 7 28.06.2013 23:55
Цифровой счетчик в С++ PointBreak Помощь студентам 0 11.09.2012 13:44
Хранение цифровой техники Leshiy1 Свободное общение 11 29.11.2011 22:02
Выбор цифровой мыльницы Баламут Свободное общение 8 12.12.2009 04:11