Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.009 c