Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.22;
Скачать: CL | DM;

Вниз

Pascal срочно, плзззз...   Найти похожие ветки 

 
Alx2 ©   (2002-04-01 14:57) [40]

Вот вариант на "чистом" ObjectPascal:

Function rormax(Val: Word): Word;
Var
K, HigherBitPos, LowBit: Integer;
Begin
Result := Val;
If Val = 0 Then exit;
HigherBitPos := trunc(ln(Val) / ln(2));
For K := 0 To HigherBitPos Do
Begin
LowBit := Val And 1;
Val := (Val Shr 1) Or (LowBit Shl HigherBitPos);
If Val > Result Then Result := Val;
End;
End;



 
cok ©   (2002-04-01 20:07) [41]

2 Alx2 © (01.04.02 14:57)
Большое вам спасибо! Ваш код работает верно.


 
KSergey ©   (2002-04-08 10:27) [42]

А вообще это классно получается: дают человеку задачку (в некоем учебном заведении), он бросает ее в форум, на ответ говорит "а он неверен, сделайте чтоб работало!" после чего дожидается правильного решения, сдает его - ну и молодец короче. И это еще учитывая то, что задачи во всех учебных заведениях даются с расчетом на уровень троечника.
Далеко пойдешь, cok!
Хочется матом, да воспитание не позволяет.

PS: хотя обсуждение получилось весьма интересным, надо заметить.


 
Rooman ©   (2002-04-08 11:36) [43]

Выводов из всего этого четыре:

1. В уч.завед. у нас преподы не знакомы с Дельфи;
2. В наших уч.завед. учат тому, что было известно 20 лет назад, а сейчас нигде не нужно (не используется);
3. Многие не знакомы с понятием "оптимизация кода процессора";
4. Коммунизм жив!
:)))

П.С. А кстати, собственно, на чем основывается утверждение о неработоспособности кода Анатолия? У меня вот все верно работает:)


 
Alx2 ©   (2002-04-08 12:00) [44]

>Rooman © (08.04.02 11:36)
>утверждение о неработоспособности кода Анатолия?
"Вращать" число надо в пределах его битовой длины, а не регистра.
>Многие не знакомы с понятием "оптимизация кода процессора";
Нет достаточных оснований для такого высказывания. Хотя, если брать в соответствующих масштабах, то - пожалуй.
Но лабы оптимизировать под процессор обычно не требуется, если не оговорено другое.


 
Rooman ©   (2002-04-08 12:21) [45]

ага, погорячился с вышесказанным...
действительно, в задаче имеется ввиду вращение числа нефиксированой ширины... такое в практике нечасто встречается:)

ну хорошо, тогда так:

function rotateN(N:word):word;
var mask:word;
begin
if N=0 then exit;
mask:=$8000;
while (mask and N)=0 do mask:=mask shr 1;
result:=N;
while mask>0 do
begin
asm
xor ax,ax
rcr N,1
jnc @1
mov ax,N
or ax,mask
mov N,ax
@1: shr mask,1
end;
if N>result then result:=N;
end;
end;


 
Rooman ©   (2002-04-08 12:23) [46]

result:=N надо первой строчкой ф-ии поставить (а не четвертой)


 
Rooman ©   (2002-04-08 12:40) [47]

А вот полностью на асме:

function rotatemaxN(N:word):word;
asm
and ax,ax
jz @4
mov cx,$8000
@1:
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr ax,1
jnc @3
or ax,cx
@3:
shr cx,1
jnz @2
@4:
end;

И не нужно логарифмов:)


 
Alx2 ©   (2002-04-08 12:42) [48]

>Rooman © (08.04.02 12:23)
:))
Что, ж продолжим флейм.
rotateN(11)=13. А надо 14 :P


 
Rooman ©   (2002-04-08 12:48) [49]

Блин, ошибку прозевал. Вот исправленый код:

function rotatemaxN(N:word):word;
asm
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr cx,1
jnz @2
@5:
end;


 
Rooman ©   (2002-04-08 12:59) [50]

Торможу и не бибикаю:))) Саму маску нельзя сдвигать:)

Вот так правильно (вроде окончательно):

function rotatemaxN(N:word):word;
asm
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
mov bx,cx
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr bx,1
jnz @2
@5:
end;


и на Паскале:

function rotateN(N:word):word;
var mask,tmp:word;
begin
if N=0 then exit;
mask:=$8000;
while (mask and N)=0 do mask:=mask shr 1;
result:=N;
tmp:=mask;
while tmp>0 do
begin
asm
xor ax,ax
rcr N,1
jnc @1
mov ax,N
or ax,mask
mov N,ax
@1: shr tmp,1
end;
if N>result then result:=N;
end;
end;


 
Alx2 ©   (2002-04-08 13:00) [51]

Издеваешься?
rotatemaxN(11)=13. А надо 14 :P


 
Rooman ©   (2002-04-08 13:01) [52]


> Alx2 © (08.04.02 13:00)
> Издеваешься?
> rotatemaxN(11)=13. А надо 14 :P


см. последний ответ - он верный. (Rooman © (08.04.02 12:59))


 
[MC]NuClon   (2002-04-08 13:04) [53]

хаха... Смотрю и удивляюсь... Из таких тривиальных тем получаются такие страсти... хыы. Конечно, кто-то прав, кто-то нет.
Кто-то сказал, мол, где это может применяться? А вы, уважаемый, когда-нибудь слышали про олимпиады??? И вообще задача на простой тривиальный перебор, но можно решить применив побольше мозгов, получив при этом более рациональный алгоритм.
Ходите к нам http://forum.isurgut.ru/cgi-bin/ultimatebb.cgi?ubb=forum&f=17
создайте нам атмосферу спора как тут.
http://nuclon.stsland.ru


 
Rooman ©   (2002-04-08 13:12) [54]

Да и еще, если компилить АСМ-код в дельфи, то надо в начале функции поставить pusha, а в конце - popa. То есть:

function rotatemaxN(N:word):word;
asm
pusha
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
mov bx,cx
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr bx,1
jnz @2
@5:
popa
end;


 
Rooman ©   (2002-04-08 13:14) [55]

Блин, устал свои же ошибки править уже:)))
Если компилить АСМ-код в дельфи, то надо в начале функции поставить push ebx, а в конце - pop ebx. То есть:

function rotatemaxN(N:word):word;
asm
push ebx
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
mov bx,cx
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr bx,1
jnz @2
@5:
pop ebx
end;



 
Rooman ©   (2002-04-08 13:18) [56]

Вот. теперь точно все. Задача решена. Осталось оптимизировать с учетом закономерностей:)


 
cok ©   (2002-04-08 20:01) [57]

2 KSergey © (08.04.02 10:27)
ЭТО ЗАДАНИЕ НЕ ДЛЯ ТРОЕШНИКОВ!!!!!!!!!! Поверьте мне (я просто не хочу говорить откуда оно, но не из школы и даже близко не от туда!)


 
[MC]NuClon   (2002-04-08 20:35) [58]

Задание пусть и не для троешников, но оно простое...
Хотите лучше?
Вас ждут тут: informatics.ru


 
Yaro ©   (2002-04-08 20:43) [59]

.


 
cok ©   (2002-04-08 21:06) [60]

2 [MC]NuClon (08.04.02 20:35)
Если бы оно было такое простое, то наверное все бы решили его верно с 1-го раза, но этого что-то не наблюдалось (за редким исключением)


 
[MC]NuClon   (2002-04-08 21:20) [61]

Сравни с http://informatics.ru/roi/XIII/firstround.xml
А мы ведь это решали.


 
cok ©   (2002-04-09 18:09) [62]

Эта ветка побьет все рекорды :)



Страницы: 1 2 вся ветка

Текущий архив: 2002.04.22;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.018 c
1-69766
Янки Дудль
2002-04-10 02:13
2002.04.22
RX Lib для


1-69811
konusov
2002-04-10 15:52
2002.04.22
Как получить сетевое имя компьютера?


1-69849
Drug
2002-04-08 00:48
2002.04.22
File not found DsgnIntf.dcu


1-69844
Vij
2002-04-11 09:57
2002.04.22
HTML Editor


14-70033
Ajax
2002-03-13 19:09
2002.04.22
Текст в .doc