avva: (Default)
[personal profile] avva
Эта запись будет интересна только программистам (ну или еще может математикам). Задача не особенно сложная, комменты скрывать не буду, не смотрите туда, если не хотите спойлеров.

Задача: написать функцию f(x), так, что f(f(x) = -x. Разрешено использовать только
целые числа. x - целочисленный аргумент (например, 32-битный).

Update: интересно, что никто, кажется, не дал правильного решения для 32-битных чисел (для "вообще целых чисел" правильных решений куча).

Update: неудивительно, потому что для 32-битных решения нет! :) У меня был глюк.
Page 1 of 4 << [1] [2] [3] [4] >>

Date: 2008-01-17 06:05 pm (UTC)
From: [identity profile] aburachil.livejournal.com
Математикам едва ли, всё ж таки умножение на i проходят на первом курсе :-)

Date: 2008-01-17 06:06 pm (UTC)
From: [identity profile] dragon-ru.livejournal.com
Решил. Но спойлерить не буду :)

Date: 2008-01-17 06:07 pm (UTC)
From: [identity profile] dragon-ru.livejournal.com
И при этом получается целое число? ;)

Date: 2008-01-17 06:10 pm (UTC)
From: [identity profile] sleeping-death.livejournal.com
с мат. решением все понятно :)

Date: 2008-01-17 06:13 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
f(x)=i*x

(I know, I know)

Date: 2008-01-17 06:13 pm (UTC)
From: [identity profile] spamsink.livejournal.com
Ух ты, еще жива задачка! Мне ее моя учительница математики задала, когда узнала, что я программированием занимаюсь - благо у нее муж был программист.

f(x) = odd(x) ? x + sgn(x) : -x+sgn(x)

Date: 2008-01-17 06:14 pm (UTC)
From: [identity profile] spamsink.livejournal.com
Screen at will.

typo

Date: 2008-01-17 06:43 pm (UTC)
From: [identity profile] dizzy57.livejournal.com
f(f(x) = -x

Date: 2008-01-17 06:45 pm (UTC)
From: [identity profile] http://users.livejournal.com/malfet_/
Ответ белым по белому:
f(x)=x-(2*x*(x&1))+sgn(x)

Date: 2008-01-17 06:54 pm (UTC)
From: [identity profile] aburachil.livejournal.com
Ошибочка вышла, мне показалось что в условии не "-х", а "побитовое отрицание икса" (в таком случае, конечно с комплексными числами прокатывает --- первая половина 32-битного числа это "действительная" часть, вторая "мнимая", а умножение на i это замена частей с побитовой инверсией одной из них).

Но с минусом-то решения вроде быть не может --- изменение знака на обычных 32-битовых числах со знаком имеет две неподвижные точки (ноль и -2^31), а стало быть это нечётная перестановка (произведение 2^31-1 инверсий). А нечётная перестановка не может быть квадратом другой перестановки.

Date: 2008-01-17 06:56 pm (UTC)
From: [identity profile] ttzt.livejournal.com
min and max := minimum and maximum expressible values

if (0 < x < max/2)
f(x) = max - 7
else if (X > max/2)
f(x) = x - max
else if (mix/2 < x < 0)
f(x) = min - x
else
f(x) = x - min

Date: 2008-01-17 07:23 pm (UTC)
From: [identity profile] avva.livejournal.com
Ну а куда ж ей деться. Но я ее раньше не встречал - или встречал, но забыл.

Date: 2008-01-17 07:25 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
f(x) = -sign(x) * (abs(x) - 1), если x - четное
f(x) =  sign(x) * (abs(x) + 1), если x - нечетное

Date: 2008-01-17 07:32 pm (UTC)
From: [identity profile] spamsink.livejournal.com
Некоторые забавные задачки (хотя и не совсем "программистские") через некоторое время "умирают", или по крайней мере остаются только в книгах: например, некогда очень популярная задача Льва Толстого про косцов, или, скажем, задача Перельмана про жильцов коммуналки (переформулировано):

Жиличка Пятеркина положила в печь пять поленьев, жиличка Тройкина - три. После того, как они вместе с жильцом Бестопливным приготовили себе еду, он достал восемь рублей и задумался, как их поделить. Помогите ему.

Date: 2008-01-17 07:48 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Ну например, такая удовлетворяет, вроде бы:

f(x) = { 2x + 1 | x%2 == 0
(1-x)/2 | other }

но думаю, что это не то, что ты имел в виду.

Date: 2008-01-17 08:10 pm (UTC)
From: (Anonymous)
Это задача более интересна в такой формулировке
Сколько принципиально разных подходов для ... вы можете предложить

Вроде классической задачи - написать функцию, которая 0->1->0
В фольклоре считалось, что хороший с-программист может дать сразу 6 различных короткий решений, отличный - 10

Date: 2008-01-17 08:41 pm (UTC)

Date: 2008-01-17 08:42 pm (UTC)
From: [identity profile] softmaster.livejournal.com
не работает %)

Date: 2008-01-17 08:44 pm (UTC)
From: [identity profile] itman.livejournal.com
Если x - положительное четное число, то функция равна x + 1 или я чего-то не понимаю?

Date: 2008-01-17 08:48 pm (UTC)
From: [identity profile] ex-decil.livejournal.com
function f($x)
{
if ($x>0)
$sign = 1;
else
$sign = -1;

if ($x % 2==0)
return $x+$sign*1;
else
return -($x-$sign*1);
}

Почти то же самое. Правда на ПХП :)

Date: 2008-01-17 08:52 pm (UTC)
From: [identity profile] http://users.livejournal.com/malfet_/
Да. Для любого четного числа функция вернет нечетное. И наоборот.

Date: 2008-01-17 08:58 pm (UTC)
From: [identity profile] itman.livejournal.com
Ах, ну да, оно же тогда станет нечетным :-)

Date: 2008-01-17 08:58 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Тут предложили трюк на основе динамической типизации
function f($x) 
{ 
  if (is_array($x)) return $x[0]; 
  return array(-$x); 
}

:)

Date: 2008-01-17 09:01 pm (UTC)
From: [identity profile] ex-decil.livejournal.com
ай, чудно! :)

Но, фактически, это противоречит условиям задачи ;)

Date: 2008-01-17 09:04 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Ну не более чем выход в комплексную плоскость в решении f(x) = i*x
:)
Page 1 of 4 << [1] [2] [3] [4] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 12:22 pm
Powered by Dreamwidth Studios