1. ホーム
  2. math

[解決済み】関数f(f(n))を設計する == -n

2022-03-23 23:18:26

質問

前回の面接で受けた質問です。

<ブロッククオート

関数を設計する f , そのようなものです。

f(f(n)) == -n

ここで n は32ビット 符号付き整数 複素数の演算はできません。

もし、全範囲の数に対してそのような関数を設計できないなら、できるだけ大きな範囲に対して設計してください。

何かアイデアはありますか?

解決方法は?

いかがでしょうか。

f(n) = sign(n) - (-1)

n

 * n

Pythonの場合。

def f(n): 
    if n == 0: return 0
    if n >= 0:
        if n % 2 == 1: 
            return n + 1
        else: 
            return -1 * (n - 1)
    else:
        if n % 2 == 1:
            return n - 1
        else:
            return -1 * (n + 1)

Pythonは整数を自動的に任意の長さのlongに昇格させます。他の言語では、最大の正の整数がオーバーフローするので、それを除いたすべての整数に対して動作します。


実数で動作させるためには n には、(-1) n { ceiling(n) if n>0; floor(n) if n<0 } .

C#の場合(オーバーフローの場合を除き、どんなダブルでも動作します)。

static double F(double n)
{
    if (n == 0) return 0;

    if (n < 0)
        return ((long)Math.Ceiling(n) % 2 == 0) ? (n + 1) : (-1 * (n - 1));
    else
        return ((long)Math.Floor(n) % 2 == 0) ? (n - 1) : (-1 * (n + 1));
}