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


Берем двойку, задаем счетчик равный 1.. Сравниваем с V. Мало - домножаем на 2, счетчик +1; снова мало - опять домножаем и увеличиваем счетчик. .
И так до тех пор, пока степень двойки не превысит V.
Что-то вроде
while tmp <= V do
begin
tmp*2;
count := count + 1;
end;
И так до тех пор, пока степень двойки не превысит V.
Что-то вроде
while tmp <= V do
begin
tmp*2;
count := count + 1;
end;
Виктор Малазония
Спасибо, просек, попробую что-нибудь сделать.
логарифм по основанию 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
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:
начало:
//---------------------------------------------------------------------------
#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
конец:
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; // конец цикла
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.
Вот конец:
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.
Евгений Свиридов
Исходник на pascal: https://yadi.sk/d/sIZOc4uZcRaA2
floor и ceil от log2(V) выводи просто
как на паскале реализовать - гугл
как на паскале реализовать - гугл
Виктор Малазония
самое смешное, что задача есть уже сейчас, а логорифмов в 8 классе нет.
Похожие вопросы
- Паскаль, не трудная задачка, помогите начинающему программисту!
- Помогите начинающему программисту.
- Помогите начинающему программисту, с чего начать?
- Помогите начинающему программисту!!!
- Помогите начинающему программисту!!!
- Вопрос программистам со стажем. Какой язык программирования учить начинающему программисту?
- Я начинающий программист, у меня нет никаких программ специальных типа Borland для использования их при написании прогр
- Выбор языка программирования, для начинающего программиста.
- Что нужно знать начинающему программисту?
- Как начинающему программисту развить абстрактно-логическое мышление?