847 Stimmen

Bestimmung der Funktion f(f(n)) == -n

Eine Frage, die mir bei meinem letzten Vorstellungsgespräch gestellt wurde:

Eine Funktion entwerfen f , so dass:

f(f(n)) == -n

Wo n ist ein 32-Bit vorzeichenbehaftete Ganzzahl Sie können nicht mit komplexen Zahlen arithmetisch rechnen.

Wenn Sie eine solche Funktion nicht für den gesamten Zahlenbereich entwickeln können, entwickeln Sie sie für den größtmöglichen Bereich.

Irgendwelche Ideen?

6 Stimmen

Um welche Stelle ging es bei diesem Vorstellungsgespräch?

0voto

Tim Leaf Punkte 370

Dies ist eine C/C++-Lösung, die keine bitweisen Operatoren verwendet und keine mathematischen Bibliotheken benötigt, obwohl es eine Art von Betrug ist...

double f(double n)
{
    if (n == (double)(int)n)
        return n + 0.5;
    else
        return -(n - 0.5);
}

Dies funktioniert für alle 32-Bit-Ganzzahlen mit der einzigen Ausnahme von 0x80000000 (da sein Gegenteil im 32-Bit-Ganzzahlensystem nicht gespeichert werden kann). f(f(n)) == -n wird immer true außer in diesem einen Fall.

Ich bin mir aber sicher, dass es einen einfacheren und schnelleren Weg gibt, dies zu implementieren. Das war nur das erste, was mir in den Sinn kam.

0voto

Artur Punkte 6660
int func(int a)  
{   
    static int p = 0;  
    int ret = a;  

    if ( p ) ret *= -1;  
    p ^= 1;  

    return ret;  
}

0voto

Eudis Duran Punkte 714

Ich weiß nicht, ob das ganz richtig ist, aber würde nicht eine einfache Flagge funktionieren? In C habe ich dies mit einer statischen lokalen Variable erfolgreich getan:

int main()
{
    int n = -256; // 32-bit signed integer
    printf("%d", f(f(n)));
}

int f(int n){
    static int x = 0; // not returning negative;
    switch(x){
        case 0:
            x = 1;
            return n;
            break;

        case 1:
            x = 0;
            return -n;
            break;
        default:
            return -999;
            break;
    }
}

0 Stimmen

Ich glaube nicht, dass dies funktionieren würde. f(3) gibt 3 zurück, f(4) gibt -4 zurück.

0voto

lemontea Punkte 1
#include <cmath>

int f(int n)
{
    static int count = 0;
    return ::cos(M_PI * count++) * n;
}

3 Stimmen

Es ist zu beachten, dass dies in einer Multithreading-Umgebung zu Problemen führen kann.

0voto

user240515 Punkte 2766

Diese Idee wurde schon in anderen Antworten verwendet, aber ich habe sie in einer Zeile Python untergebracht:

def f(n):
    return str(n) if type(n) == int else -int(n)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X