for i := 1 to m do begin
p := k div 2;
if (k mod 2) <> 0 then p := p + umn;
k := p;
end;
[Решено]Pascal.Циклический сдвиг n-разрядного двоичного представления заданого числа
Осуществить циклический сдвиг n-разрядного двоичного представления заданного числа k на m позиций вправо, не находя цифр самого двоичного представления и не пользуясь стандартной процедурой сдвига.
повторить М раз:
1. К1 := К/2
2. если К делится на 2 с остатком К1 := К1 + 2^(размерность целого числа) -- перенос младшего единичного разряда в старший
3. К := К1
uses sdvig;
var n,k,s:integer;
p:real;
begin
clrscr;
write('n=');readln(n);
write('s=');readln(s);
for k:=1 to n do
begin
if (s mod 2) = 0 then p:=s
else p:=p+exp(s*ln(2));
end;
write('p=',s:0:3);
readln
end.
1) непонятно зачем вам модуль sdvig, если процедура сдвига в основной проге
2) не надо использовать real -- только целочисленную арифметику (с real можете получить округление не в ту сторону и др. проблемы)
3) exp(s*ln(2)) -- неправильно: во-первых сама по себе формула неверна а во-вторых тут лучше простой константой задать т.к. старший единичный разряд это 2^15 (для Integer) == $8000 (в шестнадцатеричной системе)
4) ещё вы забыли разделить s на 2 (см. п.1. в моём алгоритме)
program sd1;
const umn=$8000;
var m,k,i,l,p:integer;
begin
write('kolichestvo pozicii m=');
readln(m);
write('vvedite chislo k=');
readln(k);
for i:=0 to m do
begin
if (k mod 2)=0 then l:=k else l:=l+umn
end;
p:=l div 2;
write('k=',p);
readln;
end.
Код:
извиняюсь, но забыл упомянуть что k и p должны быть не Integer а Word, иначе в случае отрицательного числа при делении старший бит равный 1 будет копироваться вправо а не смещаться , результат получится неверный. А p станет отрицательным при первом же добавлении константы $8000