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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 13:53   #1
Mandy007
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 2
Вопрос Как найти наибольшую степень двойки, не превышаюшую определенного числа N (Паскаль)

kak naiti naibolshuyu stepen' dvoiki ne previshauyshuyu opredelennogo chisla n.
Naprimer esli chislo 129 ,to togda programka dolzna pokazat' 128,to yest 2 v 7moi stepeni.
Mandy007 вне форума Ответить с цитированием
Старый 11.10.2011, 14:10   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Для возведения двойки в степень n можно воспользоваться следущим выражением: round(exp(n*ln(2)))
Вадим Мошев вне форума Ответить с цитированием
Старый 11.10.2011, 14:43   #3
Mandy007
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 2
По умолчанию

chtobi menshe opredelenogo chisla naprimer menshe 129 bilo 128.
Mandy007 вне форума Ответить с цитированием
Старый 11.10.2011, 14:48   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, можно и перебором найти требуемое решение:
Код:
var I, N  : longint;
  iPower : integer;
begin
  WriteLn('Введите число N: '); Readln(N);
  I := 1;
  iPower := 0;
  while ((I shl 1)<=N) and ((I shl 1)<=MaxInt) do begin
    inc(iPower);
    I := I shl 1;
  end;
  WriteLn('Двойка в степени ',iPower, ' равна ', I);
  readln
end.

Последний раз редактировалось Serge_Bliznykov; 11.10.2011 в 14:52.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.10.2011, 16:17   #5
Neobrat
Форумчанин
 
Регистрация: 10.12.2007
Сообщений: 124
По умолчанию

да, перебором, но не того.
Степень двойки это есть один установленный бит.
2,4,8,16,32,64,128,256,512.... и т.д. этот ряд все наверное помнят?

таким образом для решения задачи надо найти всего то, максимально установленный бит в числе. индекс бита и есть степень.

Код:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

function Calc(pValue: Cardinal): byte;
var
  xIndex: byte;
begin
  for xIndex := 31 downto 0 do
    if (pValue and ($01 shl xIndex)) > 0 then
      Exit(xIndex);

  Result := 0;
end;

var
  xValue: Cardinal;
  xStepen: Byte;
begin
  WriteLn('Введите число');ReadLn(xValue);
  xStepen := Calc(xValue);
  WriteLn('2^', xStepen,' =',$01 shl xStepen);
  ReadLn;
end.
Ноль и отрицательные числа в этом варианте не рассматриваются.
Русский язык не мой конёк

Последний раз редактировалось Neobrat; 11.10.2011 в 16:23.
Neobrat вне форума Ответить с цитированием
Старый 11.10.2011, 18:29   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Neobrat
решение красивое (правда, не вижу принципиальных отличий от своего перебора. Ведь у меня тоже только степени двойки перебираются!)

Но это не ПАСКАЛЬ! (Это Delphi)

на Паскале ваше решение можно записать так:
Код:
function Calc(pValue: longint): byte;
var
  xIndex: byte;
begin
  for xIndex := 31 downto 0 do
    if (pValue and ($01 shl xIndex)) > 0 then begin
      Calc := xIndex;
      Exit;
    end;

  Calc := 0;
end;

var
  xValue: longint;
  xStepen: Byte;
begin
  WriteLn('Введите число');ReadLn(xValue);
  xStepen := Calc(xValue);
  WriteLn('2^', xStepen,' =',$01 shl xStepen);
  ReadLn;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2011, 10:03   #7
Neobrat
Форумчанин
 
Регистрация: 10.12.2007
Сообщений: 124
По умолчанию

Принципиальных различий и быть не может, из за математического представления степени двойки.

Есть только разница в подходе поиска этого числа.
Вы ищите степень двойки меньше чем введенное число,
я же ищу старший установленный бит в веденном числе.
Русский язык не мой конёк
Neobrat вне форума Ответить с цитированием
Старый 12.10.2011, 11:15   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Neobrat
Есть только разница в подходе поиска этого числа.
Вы ищите степень двойки меньше чем введенное число,
я же ищу старший установленный бит в веденном числе.
угу. спасибо, что объяснили.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.10.2011, 12:08   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Что-то вы всё мудрите-мудрите, ещё может побитовый сдвиг вспомним )) задача решается логарифмом ))
Код:
Function BinMax(N:cardinal):byte;
Begin
  Result := trunc(ln(N)/ln(2));
End;
EDIT в первом посте не понять: степень двойки для искомого числа или само число ? если само число, то возвести по принципу из 2 поста

Последний раз редактировалось phomm; 12.10.2011 в 12:13.
phomm вне форума Ответить с цитированием
Старый 12.10.2011, 14:08   #10
Neobrat
Форумчанин
 
Регистрация: 10.12.2007
Сообщений: 124
По умолчанию

phomm

Любая задача имеет несколько решений, и эта задача не исключение.
Вы приводите общее-математическое решение задачи.
мы приводим "программистское" - частное решение, именно для основания 2.
и вы не поверите, но мы используем побитовый сдвиг(shl).
Русский язык не мой конёк
Neobrat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадраты нескольких 3-xзначных чисел оканчиваются 3 цифрами, которые составляют исходные числа. Найти эти числа. Паскаль zig1 Паскаль, Turbo Pascal, PascalABC.NET 2 12.10.2011 09:32
найти определённые простые числа в интервале [Паскаль] Юкоша Помощь студентам 4 24.12.2010 15:57
Найти наибольшую по длине последовательность простых чисел в массиве Лесная Эльфийка Помощь студентам 2 14.12.2010 16:24
Паскаль. Из заданного числа найти сумму его цифр Matlashov Помощь студентам 8 26.11.2009 14:27