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

Помогите начинающему программисту.

Мне нужно на языке Pascal написать следующюю программу. Нужно определить между какими степенями двойки лежит заданное число V. Например, если ввели число V=15, то программа должна выдать, что число 15 лежит между 8 и 16 => между 3-ей и 4-ой степенями двойки.
Мне бы хотя бы понять алгоритм.
При условии, что N > 0
Фара Фартовый
Фара Фартовый
82 293
Лучший ответ
Берем двойку, задаем счетчик равный 1.. Сравниваем с V. Мало - домножаем на 2, счетчик +1; снова мало - опять домножаем и увеличиваем счетчик. .
И так до тех пор, пока степень двойки не превысит V.
Что-то вроде
while tmp <= V do
begin
tmp*2;
count := count + 1;
end;
Pavel Vel
Pavel Vel
95 851
Виктор Малазония Спасибо, просек, попробую что-нибудь сделать.
логарифм по основанию 2 используй.
Я постарался написать код максимально близкий к вашей задаче, я написал полностью готовую программу на Embarcadero RAD Studio XE5 (Delphi):

program Project1;
uses
System.SysUtils,math;
var
v,step1,step2,povt,i,j:integer;
b,c:single;
label met1;
begin
for povt:=0 to 1000 do // повторить программу 1000 раз
begin
met1:
write('vvedite chislo: '); // ввести число
readln(v);
if(v<1)then
begin
writeln;
write('vvedite chislo >=1 !!!');
writeln;
writeln;
goto met1;
end;
writeln;
i:=0;
while power(2,i)<v do // цикл с условием для нахождения числа меньше данного
begin
step1:=i;
b:=power(2,i);
i:=i+1;
end; // конец цикла

if(power(2,step1+1)=v)then // для нахождения числа больше данного
begin // если введённое число равно 2 в N степени
step2:=step1+2;
c:=power(2,step2);
end

else // для нахождения числа больше данного
begin // если введённое число меньше 2 в N степени
step2:=step1+1;
c:=power(2,step2);
end;
i:=Round(b);
j:=Round(c);

write('chislo ',v,' lezhit mezhdu ',i,' i ',j,' => mezhdu 2^',step1,' i ','2^',step2);
writeln;
writeln;
end;
end.



Скачать исходники этого проекта можно отсюда: https://yadi.sk/d/l86Yk3SEcR8P3
Евгений Свиридов Я в коде допустил ошибку (описа'лся) , не if(v<1)then, а if(v<=1)then (т. е. можно вводить числа начиная только от 2-х !!!)

Вот мой код в C++ Builder 6:

начало:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
int v,b=1,c=0,step1,step2;
for(int povt=0;povt<1;povt++)
{
met1:
cout<<"vvedite chislo: ";
cin>>v;
if(v<=1)
{
cout<<"\n";
cout<<"vvedite chislo >1 !!!";
cout<<"\n\n";
goto met1;
}

cout<<"\n";
for(int i=0;pow(2,i)<v;i++)
{
step1=i;
b=pow(2,i);
}
Евгений Свиридов Вот мой код в C++ Builder 6:
конец:
if(pow(2,step1+1)==v)
{
step2=step1+2;
c=pow(2,step2);
}

else
{
step2=step1+1;
c=pow(2,step2);
}

cout<<"chislo "<<v<<" lezhit mezhdu "<<b<<" i "<<c<<" => mezhdu 2^"<<step1<<" i "<<"2^"<<step2<<"\n\n";
povt-=1;
}
return 0;
}

/*
Мне нужно на языке Pascal написать следующюю программу. Нужно определить между какими степенями двойки лежит заданное число V. Например, если ввели число V=15, то программа должна выдать, что число 15 лежит между 8 и 16 => между 3-ей и 4-ой степенями двойки.
Мне бы хотя бы понять алгоритм.
*/

Скачать исходники этого проекта можно отсюда: https://yadi.sk/d/aU-r-Lo2cRAhD
Евгений Свиридов Вот исправленный мной полностью рабочий код на Delphi:

program Project1;
uses
System.SysUtils,math;
var
v,step1,step2,povt,i,j:integer;
b,c:single;
label met1;
begin
for povt:=0 to 1000 do // повторить программу 1000 раз
begin
met1:
write('vvedite chislo: '); // ввести число
readln(v);
if(v<=1)then
begin
writeln;
write('vvedite chislo >1 !!!');
writeln;
writeln;
goto met1;
end;
writeln;
i:=0;
while power(2,i)<v do // цикл с условием для нахождения числа меньше данного
begin
step1:=i;
b:=power(2,i);
i:=i+1;
end; // конец цикла
Евгений Свиридов Скачать исходники этого исправленного проекта на Delphi можно отсюда: https://yadi.sk/d/b1ZxPYF6cRBJm
Евгений Свиридов Это было начало кода.

Вот конец:

if(power(2,step1+1)=v)then // для нахождения числа больше данного

begin // если введённое число равно 2 в N степени
step2:=step1+2;
c:=power(2,step2);
end

else // для нахождения числа больше данного
begin // если введённое число меньше 2 в N степени
step2:=step1+1;
c:=power(2,step2);
end;
i:=Round(b);
j:=Round(c);

write('chislo ',v,' lezhit mezhdu ',i,' i ',j,' => mezhdu 2^',step1,' i ','2^',step2);
writeln;
writeln;
end;
end.
floor и ceil от log2(V) выводи просто

как на паскале реализовать - гугл
Виктор Малазония самое смешное, что задача есть уже сейчас, а логорифмов в 8 классе нет.