f(f(x)) = -x
От: deniok Россия  
Дата: 17.01.08 19:50
Оценка: 10 (2)

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

от avva
Re: f(f(x)) = -x
От: Панда Россия  
Дата: 17.01.08 19:56
Оценка:
На языках с динамической типизацией все просто

<?php
function f($x)
{
  if (is_array($x)) return $x[0];
  return array(-$x);
}
?>
Re[2]: f(f(x)) = -x
От: deniok Россия  
Дата: 17.01.08 19:59
Оценка:
Здравствуйте, Панда, Вы писали:

П>На языках с динамической типизацией все просто


Да, прицепить атрибут — это идея А без этого?
Re: f(f(x)) = -x
От: Панда Россия  
Дата: 17.01.08 19:59
Оценка:
На сях:

int f(int x)
{
    return (x+MAX_INT/2);
}
Re[2]: f(f(x)) = -x
От: Панда Россия  
Дата: 17.01.08 20:01
Оценка:
ой, это я фигню какую-то написал
Re: f(f(x)) = -x
От: Панда Россия  
Дата: 17.01.08 20:14
Оценка:
Подумал. В целом — задача неразрешимая. Потому что есть такое 32-битное x, для которого невозможно записать 32 битами -x. Это число, у которого все биты 1.

Если это число выкинуть из допустимых аргументов — то придумал.
Продемонстрирую идею такой функции, если x может принимать значения от -3 до 3.
int f(int x)
{
  int y[] = {0, 1, 2, 3, 0, -1, -2, -3};
  return y[(x+2)%8];
}
Re: f(f(x)) = -x
От: RomikT Германия  
Дата: 17.01.08 20:14
Оценка: 10 (3)
Здравствуйте, deniok, Вы писали:

D>

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


Наверняка не самое короткое решение, но вроде работать будет.
if (x==0) {
  return 0;
}
if (x>0) {
  if (x & 1 == 1) {
    return x+1;
  } else {
    return -x+1;
  }
} else {
  if (x & 1 == 1) {
    return x-1;
  } else {
    return -x-1;
  }
}
Re: f(f(x)) = -x
От: Vintik_69 Швейцария  
Дата: 17.01.08 20:17
Оценка:
Здравствуйте, deniok, Вы писали:

D>

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


Так это невозможно. Отрицательных чисел больше, чем положительных.
Re[2]: f(f(x)) = -x
От: deniok Россия  
Дата: 17.01.08 20:19
Оценка:
Здравствуйте, Vintik_69, Вы писали:

V_>Так это невозможно. Отрицательных чисел больше, чем положительных.


Ну формалист! Откинь одно отрицательное.
Re[2]: f(f(x)) = -x
От: Vintik_69 Швейцария  
Дата: 17.01.08 20:24
Оценка:
Здравствуйте, RomikT, Вы писали:

RT>Наверняка не самое короткое решение, но вроде работать будет.


Не работает для 2147483647
Re: f(f(x)) = -x
От: Vintik_69 Швейцария  
Дата: 17.01.08 20:31
Оценка:
Здравствуйте, deniok, Вы писали:

D>

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


int f(int x)
{
    const unsigned int MAX = (1 << 31);
    
    int order = x >= 0 ? x : -x + MAX;
    order = (order + MAX/2);
    if (order < MAX) return order;
    else return -(order - MAX);
}
Re: f(f(x)) = -x
От: Панда Россия  
Дата: 17.01.08 20:37
Оценка:
Кстати, можно сформулировать аналогичную задачу по математике, а не по программированию.
Найти функцию f, для которой f(f(x)) — -x
x — любое вещественное число без ограничений.
Такую функцию я тоже придумал, но пока не смог записать ее аналитически.
Re[3]: f(f(x)) = -x
От: RomikT Германия  
Дата: 17.01.08 20:38
Оценка:
Здравствуйте, Vintik_69, Вы писали:

V_>Здравствуйте, RomikT, Вы писали:


RT>>Наверняка не самое короткое решение, но вроде работать будет.


V_>Не работает для 2147483647


По моему, несложно доказать что среди чисел от -2147483648 до 2147483647 невозможно давать правильный результат для всех чисел.
Как минимум, два числа окажутся неохваченными. Одно — просто потому, что нет числа +2147483648. А второе — ну так мир устроен
Re[2]: f(f(x)) = -x
От: deniok Россия  
Дата: 17.01.08 20:40
Оценка: 15 (1)
Здравствуйте, RomikT, Вы писали:

Я чуть короче решил, но идея аналогичная
f x = if even x then - sign x * (abs x - 1)
                else   sign x * (abs x + 1)

Проверка
*Main1> map (f . f) [-5..10]
[5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
Re[4]: f(f(x)) = -x
От: Vintik_69 Швейцария  
Дата: 17.01.08 20:42
Оценка:
Здравствуйте, RomikT, Вы писали:

RT>Как минимум, два числа окажутся неохваченными. Одно — просто потому, что нет числа +2147483648. А второе — ну так мир устроен


Ну насчет второго — не понятно. У меня вроде для всех, кроме одного, работает.
Re[2]: f(f(x)) = -x
От: RomikT Германия  
Дата: 17.01.08 20:43
Оценка:
Здравствуйте, Vintik_69, Вы писали:

V_>
V_>int f(int x)
V_>{
V_>    const unsigned int MAX = (1 << 31);
    
V_>    int order = x >= 0 ? x : -x + MAX;
V_>    order = (order + MAX/2);
V_>    if (order < MAX) return order;
V_>    else return -(order - MAX);
V_>}
V_>


А это решение не работает для 1073741824...
Я же говорю — не получится всех чисел
Re[3]: f(f(x)) = -x
От: Панда Россия  
Дата: 17.01.08 20:46
Оценка:
RT>А это решение не работает для 1073741824...
RT>Я же говорю — не получится всех чисел

Ну давайте в пятый раз это скажем!
Re[3]: f(f(x)) = -x
От: Vintik_69 Швейцария  
Дата: 17.01.08 20:49
Оценка:
Здравствуйте, RomikT, Вы писали:

RT>А это решение не работает для 1073741824...

RT>Я же говорю — не получится всех чисел

Хмм, правда
Re: f(f(x)) = -x
От: Аноним  
Дата: 17.01.08 21:13
Оценка:
Здравствуйте, deniok, Вы писали:

D>

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

D>от avva

Задача очевидно не имеет решения.
Re[2]: f(f(x)) = -x
От: deniok Россия  
Дата: 17.01.08 21:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Задача очевидно не имеет решения.


Для пуристов: снимаю ограничение на 32 бита. Допустимы произвольные целые — BigInteger.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.