Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[Решено]Pascal.Циклический сдвиг n-разрядного двоичного представления заданого числа

60K
26 мая 2010 года
nmar
3 / / 26.05.2010
помогите пожалуйста, хотя бы с чего начать.. с паскалем не очень знаком..
Осуществить циклический сдвиг n-разрядного двоичного представления заданного числа k на m позиций вправо, не находя цифр самого двоичного представления и не пользуясь стандартной процедурой сдвига.
1.8K
26 мая 2010 года
LM(AL/M)
332 / / 20.12.2005
Если нельзя пользоваться стандартной процедурой сдвига и находить представление значит нужно использовать простую арифметику. Алгоритм такой:

повторить М раз:
1. К1 := К/2
2. если К делится на 2 с остатком К1 := К1 + 2^(размерность целого числа) -- перенос младшего единичного разряда в старший
3. К := К1
60K
27 мая 2010 года
nmar
3 / / 26.05.2010
не судите строго)). типа этого получается? покажите как правильно плиз.
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.8K
27 мая 2010 года
LM(AL/M)
332 / / 20.12.2005
почти. вот что неправильно:
1) непонятно зачем вам модуль sdvig, если процедура сдвига в основной проге
2) не надо использовать real -- только целочисленную арифметику (с real можете получить округление не в ту сторону и др. проблемы)
3) exp(s*ln(2)) -- неправильно: во-первых сама по себе формула неверна а во-вторых тут лучше простой константой задать т.к. старший единичный разряд это 2^15 (для Integer) == $8000 (в шестнадцатеричной системе)
4) ещё вы забыли разделить s на 2 (см. п.1. в моём алгоритме)
60K
27 мая 2010 года
nmar
3 / / 26.05.2010
так примерно получается?
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.
1.8K
27 мая 2010 года
LM(AL/M)
332 / / 20.12.2005
Сравните:
 
Код:
for i := 1 to m do begin
  p := k div 2;
  if (k mod 2) <> 0 then  p := p + umn;
  k := p;
end;


извиняюсь, но забыл упомянуть что k и p должны быть не Integer а Word, иначе в случае отрицательного числа при делении старший бит равный 1 будет копироваться вправо а не смещаться , результат получится неверный. А p станет отрицательным при первом же добавлении константы $8000
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог