Подумал. В целом — задача неразрешимая. Потому что есть такое 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];
}
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);
}
Кстати, можно сформулировать аналогичную задачу по математике, а не по программированию.
Найти функцию f, для которой f(f(x)) — -x
x — любое вещественное число без ограничений.
Такую функцию я тоже придумал, но пока не смог записать ее аналитически.
Здравствуйте, Vintik_69, Вы писали:
V_>Здравствуйте, RomikT, Вы писали:
RT>>Наверняка не самое короткое решение, но вроде работать будет.
V_>Не работает для 2147483647
По моему, несложно доказать что среди чисел от -2147483648 до 2147483647 невозможно давать правильный результат для всех чисел.
Как минимум, два числа окажутся неохваченными. Одно — просто потому, что нет числа +2147483648. А второе — ну так мир устроен
Здравствуйте, RomikT, Вы писали:
RT>Как минимум, два числа окажутся неохваченными. Одно — просто потому, что нет числа +2147483648. А второе — ну так мир устроен
Ну насчет второго — не понятно. У меня вроде для всех, кроме одного, работает.