![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите с задачкой [D7, XP]
jacksotnik © (2011-04-20 14:22:00)Есть такая задача:
Решить как минимум двумя способами (простым и быстрым) следующую задачу: написать функцию, которая возвращает количество нулевых бит в символах строки (не считая нулевой символ в конце строки). Значит один способ я сообразил вот собственно он:
function TZero_bits.CountZeroBits(str: string): integer;
var s_bin,bit:string; i,j,symb,zero_count:integer;
begin
zero_count:=0;
for i:=1 to length(str) do
begin
s_bin:='';
symb:=ord(str[i]); //получение десятичного кода символа
//Преобразование в двоичный код
while symb >= 1 do
begin
bit:=IntToStr(symb mod 2);
symb:=symb div 2;
s_bin:=bit+s_bin;
end;
//считаем нулей
for j:=1 to length(s_bin) do
begin
if s_bin[j] = '0' then
inc(zero_count);
end;
end;
result:= zero_count;
end;
А вот второй способ(быстрый) чето совсем догнать не могу. Может кто поможет?
Anatoly Podgoretsky (2011-04-20 16:19:00) [1]> jacksotnik (20.04.2011 15:47:20) [20]
Значит для другого пишешь?
Anatoly Podgoretsky (2011-04-20 16:16:00) [2]> jacksotnik (20.04.2011 14:49:07) [7]
То есть ANSI это уже не символ?
Anatoly Podgoretsky (2011-04-20 16:15:00) [3]> KilkennyCat (20.04.2011 14:29:01) [1]
В военное время 256 значений
Ega23 (2011-04-20 16:07:00) [4]
> для каждого символа заранее прописать кол-во нулей? Этож
> жесть ето что для всех сидеть и пересчитывать
Ты программист, или StringList собачий?
Напиши программку, которая генерит массив констант и сохраняет в текстовый файл.
Хотя (если честно), не факт, что это будет быстрее, чем с калькулятором 256 вариантов перебрать.
Ega23 (2011-04-20 15:58:00) [5]1. Заводишь константу массив [0..255] of byte;
2. В каждый i-й элемент массива прописываешь количество нулей, содержащееся в двоичном представлении i
3. функция приобретает вид
function SumNulBits(const Value: AnsiString): Integer4. Не забываешь следить за размером result (дабы за $7FFFFFFF не вышел).
const
BitsArray: array [0..255] of byte = (8, 7, 7, 6, 7, 6, ....., 1, 0);
var
i: Integer;
begin
Result := 0;
for i := 1 to Length(Value) do
Result := Result + BitsArray[Ord(Value[i])];
end;
всё.
oldman (2011-04-20 15:50:00) [6]позади военком или ректор?
разжевали уже все. работы на час максимум.
jacksotnik (2011-04-20 15:47:00) [7])))))))) У меня эти времена слава богу уже давно позади
oldman (2011-04-20 15:45:00) [8]
> jacksotnik (20.04.11 15:40) [18]
> Нисколько!
Придется платить военкому. Или ректору.
jacksotnik (2011-04-20 15:40:00) [9]Нисколько!
Плохиш (2011-04-20 15:39:00) [10]
> jacksotnik (20.04.11 14:47) [5]
> Прочти внимательнее задание. Ну что друзья поможет кто-то
> с вторым вариантом?
>
Сколько готов заплатить?
jacksotnik (2011-04-20 15:37:00) [11]Нашел вот такую функцию вроде все работает только не пойму стабильно для каждого символа показывает нулей на один больше чем надо
function TZero_bits2.GetZeroBitCount(const s: string): integer;
const
//число нулевых бит в тетрадах 0..15
ZBits:array[0..15] of integer = (4,3,3,2, 3,2,2,1, 3,2,2,1, 2,1,1,0);
var
i:integer;
begin
Result:=0;
for i:=1 to Length(s) do
inc(Result,Zbits[byte(s[i]) and 15]+Zbits[byte(s[i]) shr 4]);
end;
MBo (2011-04-20 15:36:00) [12]>Этож жесть ето что для всех сидеть и пересчитывать
Один раз делаешь это своей же медленной программой, выводя результаты для каждого символа.
oldman (2011-04-20 15:30:00) [13]Пуск-Программы-Служебные-Стандартные-Калькулятор
Режим = Инженерный
Набираем число в dec, кликаем на bin
И так 256 раз
Вам шашечки или ехать?
jacksotnik (2011-04-20 15:26:00) [14]для каждого символа заранее прописать кол-во нулей? Этож жесть ето что для всех сидеть и пересчитывать
oldman (2011-04-20 15:15:00) [15]zero_count:=0;
a:='87767665.....0' // длина а=256
for i:=1 to length(str) zero_count:=zero_count+a[ord(str[i])]
result:= zero_count;
смешно. предложили аж в [1]
мы ветку не читаем? нам решение нужно копи и пасте?
oldman (2011-04-20 15:07:00) [16]http://www.rsdn.ru/forum/dotnet/3482639.flat.aspx
поможет?
oldman (2011-04-20 14:58:00) [17]
> jacksotnik (20.04.11 14:47) [5]
А тебе не кажется, что слово "бит" что-то значит?
То еcть, для '1' количество нулевых бит равно не 0, а 7,
поскольку не '1', а '00000001'
oldman (2011-04-20 14:53:00) [18]
> Ну что друзья поможет кто-то с вторым вариантом?
Гугль поможет.
набери в строке поиска "количество нулевых бит в символах строки"
Судя по количеству найденных подобных просьб либо ты на куче форумов, либо задача из учебника.
Копипастить ответы, извини, я не буду.
jacksotnik (2011-04-20 14:52:00) [19]в своем варианте я сначала symb:=ord(str[i]); получаю десятичный код символа потом перевожу десятичное число в двоичную строку и в ней уже считаю нолики
jacksotnik (2011-04-20 14:49:00) [20]
> что есть символ?
ASCII символ. Точнее его двоичный код. Вот надо в двоичном коде посчитать кол-во нулевых бит