Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2009, 20:40   #21
Longedok
Пользователь
 
Аватар для Longedok
 
Регистрация: 14.07.2007
Сообщений: 40
По умолчанию

Интересная задача. Нашёл решение для явы (и других языков, в которых корректно работает операция >> и есть операция ^): (i ^ (i >> 31)) — (i >> 31). В делфи подбное реализовать не полуилось. Хотя можно обойтись и без ^, но операция shr как-то неправильно работает, и вместо арифметического сдвига делает логический. (i := -4, i shr 31 = 1, хотя при арифметическом сдвиге должно быть -1).
Котэ покарает тебя, %username%!

Последний раз редактировалось Longedok; 26.06.2009 в 20:43.
Longedok вне форума Ответить с цитированием
Старый 26.06.2009, 21:15   #22
NuMeR
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

Longedok, идея подобная вашей пришла в голову где-то за пол часа до вашего сообщения но сдвигами в паскале, как вы уже сказали, логические а не арифметические, поэтому ничего хорошего у меня не вышло, но в таком решении надо знать разрядность числа.
p.s.в моем решении, которое я придумал раньше использовалось 5 операций, но сегодня, когда я опять начал думать над этой задачей удалось придумать решение сначала из 4-х операций, а потом упростить его до 3-х.вроде короче уже нельзя, но возможно есть что-то нелогичное, но работающее(как в первой задачке)
NuMeR вне форума Ответить с цитированием
Старый 26.06.2009, 21:21   #23
Longedok
Пользователь
 
Аватар для Longedok
 
Регистрация: 14.07.2007
Сообщений: 40
По умолчанию

Хм, интересно. Попробую тогда сегодня ещё немного над этой задачей подумать, так что, пожалуйста, не показывайте решение до завтра.

Единственное до чего пока додумался, это:
Код:
((not (i shr 31) + 1) xor i) - (not (i shr 31) + 1)
Решение очень громоздкое, некрасивое, с позорными восемью операциями и необходимостью знать разряд числа.
Котэ покарает тебя, %username%!

Последний раз редактировалось Stilet; 30.06.2009 в 16:11.
Longedok вне форума Ответить с цитированием
Старый 27.06.2009, 12:25   #24
NuMeR
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

Longedok, зато решение работает и его можно упростить до 4-х операций.
i shr 31 равно 0 если i неотрицательное и 1 если число отрицательное. т.е. мы можем получить знак числа. например таким образом -2*(i shr 31)+1 а потом просто домножить на этот знак само число i, т.е. конечная формула (-2*(i shr 31)+1)*i это и будет модуль числа.
в своем решении я для получения знака числа я использую mod 2
NuMeR вне форума Ответить с цитированием
Старый 27.06.2009, 13:02   #25
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
в своем решении я для получения знака числа я использую mod 2
o_O! А как можно получить знак числа через mod 2 ???
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.06.2009, 13:15   #26
NuMeR
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

mod 2 может возыращать значения 1,-1,0
NuMeR вне форума Ответить с цитированием
Старый 27.06.2009, 13:38   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот мой вариант.
вроде от длины числа не зависит...
Код:
function MyAbs(N : LongInt) : longInt;
begin
  MyAbs := ((N mod 2) + ((N+1) mod 2))*N;
end;

Последний раз редактировалось Serge_Bliznykov; 27.06.2009 в 13:40.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.06.2009, 13:47   #28
NuMeR
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

Serge_Bliznykov, отлично, именно такое решение было у меня потом я его сократил до ((2*x+1)mod 2)*x а потом понял, что получить нечетное число того же знака можно проще чем 2*x+1 и получилось решение из трех операций ((x or 1)mod 2)*x
NuMeR вне форума Ответить с цитированием
Старый 27.06.2009, 13:57   #29
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Коллега, респект. я явно не "дотянул" до Вашего решения. (да и с Вашей стороны подсказочка с mod 2 была...)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.06.2009, 14:03   #30
NuMeR
Пользователь
 
Регистрация: 25.06.2009
Сообщений: 39
По умолчанию

Serge_Bliznykov, спасибо
ну что ж задачка №3.
нужно записать формулой следующую функцию
Код:
function f(x:longint):longint;
begin
  if x=0 then f:=0 else f:=1;
end;

Последний раз редактировалось NuMeR; 28.06.2009 в 10:57.
NuMeR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игры для программистов [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 78 12.07.2010 03:42
Задачка для программистов meira87 Свободное общение 6 24.03.2009 20:43
Игры для программистов! Rembo Свободное общение 17 29.12.2007 09:22
ДЛЯ ПРОГРАММИСТОВ!!! VOLODIA Свободное общение 0 09.04.2007 23:01