![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pascal срочно, плзззз...
cok © (2002-03-30 14:55:00)Я сейчас пишу прогу на Паскале, вот. Проблева в следующем:
у меня есть число в 10-ной системе счисления, я перевожу его в 2-ую сист.сч., меняю местами некоторые 1 и 0, а потом перевожу это в 10-ую сист.сч, но число больше 6000, и поэтому, когда я его перевожу в 2-ую сист. по длине оно будет ого го, т.е длиннее чем LongInt! Я пытался использовать тип comp или extended, но тогда прога не правильно будет переводить число в 10-ую сист. сч. Че делать?
cok (2002-04-09 18:09:00) [1]Эта ветка побьет все рекорды :)
[MC]NuClon (2002-04-08 21:20:00) [2]Сравни с http://informatics.ru/roi/XIII/firstround.xml
А мы ведь это решали.
cok (2002-04-08 21:06:00) [3]2 [MC]NuClon (08.04.02 20:35)
Если бы оно было такое простое, то наверное все бы решили его верно с 1-го раза, но этого что-то не наблюдалось (за редким исключением)
Yaro (2002-04-08 20:43:00) [4].
[MC]NuClon (2002-04-08 20:35:00) [5]Задание пусть и не для троешников, но оно простое...
Хотите лучше?
Вас ждут тут: informatics.ru
cok (2002-04-08 20:01:00) [6]2 KSergey © (08.04.02 10:27)
ЭТО ЗАДАНИЕ НЕ ДЛЯ ТРОЕШНИКОВ!!!!!!!!!! Поверьте мне (я просто не хочу говорить откуда оно, но не из школы и даже близко не от туда!)
Rooman (2002-04-08 13:18:00) [7]Вот. теперь точно все. Задача решена. Осталось оптимизировать с учетом закономерностей:)
Rooman (2002-04-08 13:14:00) [8]Блин, устал свои же ошибки править уже:)))
Если компилить АСМ-код в дельфи, то надо в начале функции поставить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:12:00) [9]Да и еще, если компилить АСМ-код в дельфи, то надо в начале функции поставить
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;
[MC]NuClon (2002-04-08 13:04:00) [10]хаха... Смотрю и удивляюсь... Из таких тривиальных тем получаются такие страсти... хыы. Конечно, кто-то прав, кто-то нет.
Кто-то сказал, мол, где это может применяться? А вы, уважаемый, когда-нибудь слышали про олимпиады??? И вообще задача на простой тривиальный перебор, но можно решить применив побольше мозгов, получив при этом более рациональный алгоритм.
Ходите к нам http://forum.isurgut.ru/cgi-bin/ultimatebb.cgi?ubb=forum&f=17
создайте нам атмосферу спора как тут.
http://nuclon.stsland.ru
Rooman (2002-04-08 13:01:00) [11]
> Alx2 © (08.04.02 13:00)
> Издеваешься?
> rotatemaxN(11)=13. А надо 14 :P
см. последний ответ - он верный. (Rooman © (08.04.02 12:59))
Alx2 (2002-04-08 13:00:00) [12]Издеваешься?
rotatemaxN(11)=13. А надо 14 :P
Rooman (2002-04-08 12:59:00) [13]Торможу и не бибикаю:))) Саму маску нельзя сдвигать:)
Вот так правильно (вроде окончательно):
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;
Rooman (2002-04-08 12:48:00) [14]Блин, ошибку прозевал. Вот исправленый код:
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;
Alx2 (2002-04-08 12:42:00) [15]>Rooman © (08.04.02 12:23)
:))
Что, ж продолжим флейм.
rotateN(11)=13. А надо 14 :P
Rooman (2002-04-08 12:40:00) [16]А вот полностью на асме:
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;
И не нужно логарифмов:)
Rooman (2002-04-08 12:23:00) [17]result:=N надо первой строчкой ф-ии поставить (а не четвертой)
Rooman (2002-04-08 12:21:00) [18]ага, погорячился с вышесказанным...
действительно, в задаче имеется ввиду вращение числа нефиксированой ширины... такое в практике нечасто встречается:)
ну хорошо, тогда так:
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;
Alx2 (2002-04-08 12:00:00) [19]>Rooman © (08.04.02 11:36)
>утверждение о неработоспособности кода Анатолия?
"Вращать" число надо в пределах его битовой длины, а не регистра.
>Многие не знакомы с понятием "оптимизация кода процессора";
Нет достаточных оснований для такого высказывания. Хотя, если брать в соответствующих масштабах, то - пожалуй.
Но лабы оптимизировать под процессор обычно не требуется, если не оговорено другое.
Rooman (2002-04-08 11:36:00) [20]Выводов из всего этого четыре:
1. В уч.завед. у нас преподы не знакомы с Дельфи;
2. В наших уч.завед. учат тому, что было известно 20 лет назад, а сейчас нигде не нужно (не используется);
3. Многие не знакомы с понятием "оптимизация кода процессора";
4. Коммунизм жив!
:)))
П.С. А кстати, собственно, на чем основывается утверждение о неработоспособности кода Анатолия? У меня вот все верно работает:)