Другие языки программирования и технологии

Помогите пожалуйста!Паскаль. Дано натуральное число N. Получить наименьшее число вида 2(m в степени), превосходящее N.

var
idx, n, m: integer;
begin
readln(n);
for idx := 0 to n do
begin
if idx=0 then m := 1 else
m:=trunc(ln(idx)/ln(2))+integer((ln(idx)/ln(2)) >= trunc(ln(idx)/ln(2)));
writeln(idx, ' - ', m);
end;
readln;
end.
Выводит искомые значения в диапазоне [0..N]. Программу легко модифицировать для вывода единственного значения.
---
Уважайте время других участников Ответов. Не забывайте отмечать лучшие ответы.
Shakhmardan Mazhitov
Shakhmardan Mazhitov
5 083
Лучший ответ
R := 1; M := 1;
while R <= N do
begin
Inc(M);
R := R shl 1;
end;
WriteLn('2^', M, ' = ', R, ' > ', N);
Василий Мухин
Василий Мухин
56 806
Ужосы какие! Логарифмы, огругления! А вы знаете, сколько тактов требует расчет логарифма и нафиг оно нужно для этой задачи? Не проще ли просто аккумулятор забить в единицу и в цикле множить на 2 до тех пор, пока не станет больше чем N?
Всего-то будет максимум 32 раза, что скорее всего - будет быстрее, чем считать логарифм.. . Если вместо умножения использовать битовый сдвиг влево - то будет еще быстрее.. .
А на самом деле эту задачу можно сделать вообще быстро: убить младшие значащие биты в числе (оставив только старший) , после чего, сдвинуть все на разряд влево.. . Хуший случай дасть 32 итерации, но зато лучший - всего одну...
Пиши на почту, договоримся.
Или в асю - 447890533

Похожие вопросы