While5. Дано целое число $$N$$ ($$> 0$$), являющееся некоторой степенью числа 2: $$N = 2^K$$. Найти целое число $$K$$ — показатель этой степени.
Решение от Андрея:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
program While5; var N, K :Integer; begin Write('Введите N: '); Readln(N); K:=0; while n>1 do begin n:= n div 2; inc(K); end; Writeln('Результат деления на цело: ',K); end. |
Решение 2:
С помощью логического сдивига:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
program While5; var N, K :Integer; begin Write('Введите N: '); Readln(N); K:=0; while n>1 do begin n:= n shr 1; inc(K); end; Writeln('Результат деления на цело: ',K); end. |
Другие задачи из раздела While можно посмотреть здесь.
Если N=1, то K должен быть 0.
Плюс по такому алгоритму будет число на 1 меньше необходимого
исправил.
А в каком компияторе паскаля работает конструкция «k+=1;»?
PascalABC.NET последняя версия. http://pascalabc.net
Оно так и работает. Если N=1 то выполняется условие «while temp>=2 do» цикл не проходит и K остаётся нулевым.
Понял, согласен.
Да, действительно у меня было не так красиво:
Изменил на вариант Андрея.
Ещё вместо div можно использовать shr 1(логический сдвиг на 1 бит, что в данной задаче эквивалентно делению на 2, но возможно более быстрее отрабатывает).
я так сделал:
var
n:real;
s:integer;
begin
s:=1;
writeln (‘число в степени 2:’);
readln (n);
if n=1 then
begin
write (‘ нулевая степень’);
exit;
end
else
while n>2 do
begin
n:=n/2;
s:=s+1;
//writeln (‘степень=’,s,’ число= ‘,n); {разкоментировать для наглядности}
end;
writeln (s,’степень’);
end.
нет,вот так лучше:
var
n:real;
s:integer;
begin
s:=0;
writeln (‘число в степени 2:’);
readln (n);
while n>1 do
begin
n:=n/2;
s:=s+1;
end;
writeln (s,’ степень’);
end.