Двоичное счисление. Задача
Подскажите, как решить данную задачу (в паскаль авс)? Указать то число заданного множества целых чисел, в двоичном представлении которого больше всего единиц. И по возможности объясните на словах, что здесь вообще выполняется?
|
Ну для затравки каждое 10 число можно перевести в двоичное, этому по моему учат еще в школе, классе этак в 7-ом.
Подсказка - каждый бит в двоичном числе переводится в 10 как сумма 2 в степени (позиция бита (считая слева от 0)) умноженная на значение бита, т.е. 10001010 = 2^0*0 + 2^1*1 + 2^2*0 + 2^3*1 + 2^4*0+2^5*0+2^6*0+2^7*1= 0+2+0+8+0+0+0+128=138 Вам же надо провести обратную операцию, алгоритм примерно следующий: 1. ПеременнаяКолЕдиниц :=0 2. ПерменнаяЧисло:=0 3. Берем число из множества 4. Переводим его в двоичную систему 5. Подсчитывать сколько бит выставлено в 1 4. Если число единиц больше чем в сохранено в ПеременнаяКолЕдиниц, то ПеременнаяКолЕдиниц :=число единиц, ПерменнаяЧисло:=Число из множества 5. Если не конец множества то к шагу 3 6. Вывести ПерменнаяЧисло |
Зы:
Если множество конечно (известна максимальная разрядность в ),то количество единиц в числе можно посчитать упрощенным способом использую операцию побитого И (AND) . типа A - целое беззнаковое число из множества (0<A<255) N := (A and 128)+(A and 64)+(A and 32)+(A and 16)+(A and 8)+(A and 4)+(A and 2)+(A and 1) |
Цитата:
Код:
Var |
Vladimir_S, спасибо! А вы можете пояснить, почему там после Writeln '+St+' пишется с плюсами?
А ещё, в первой процедуре переводим числа в строковый тип; Во второй процедуре обратно. А как мы узнаём в каком числе больше единиц? И можно ли сделать, чтобы выводилось это число в десятичном виде? |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вообще мой Вам совет - оттранслируйте и запустите программу. Тогда многое прояснится. Кстати, сейчас увидел, что вторую функцию можно и попроще сделать, без преобразования каждого символа строки в число. Вот так: Код:
Function Ones(S:String):Byte; |
Vladimir_S, ещё раз спасибо - теперь многое прояснилось! А я думала, что по условию задачи мы вводим несколько чисел, далее смотрим в каком из них больше единиц в двоичном представлении и выводим на экран уже то число. Значит это не так, да?
|
Вложений: 1
Цитата:
вводим числа, пока не введем ноль - на нем всё заканчивается. После ввода каждого числа оно преобразуется в двоичную форму, подсчитывается количество единиц в этой двоичной форме и все три числа (самО число, его двоичная форма и количество единиц) запоминаются в переменных N, St и NO, соответственно. St и NO выводятся на экран. Далее смотрится, не превышает ли количество единиц в двоичной записи (NO) ранее найденное максимальное значение количества единиц (Max). Если превышает, то запоминаем полученные три числа (точнее, число, строку и число), как M, SM и Max. Дальше обрабатываем следующее вводимое десятичное число. В итоге всего этого у нас остаются параметры M, SM и Max, соответствующие числу, имеющему наибольшее количество единиц в двоичной записи. Их мы и выводим на экран. P.S. Если чисел, имеющих в своей двоичной записи максимальное количество единиц, было введено несколько, то запоминается и выводится первое из них. Вот как выглядит экран работающей программы: |
Часовой пояс GMT +4, время: 15:46. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.