Hier ist ein Beweis dafür, warum eine solche Funktion nicht für alle Zahlen existieren kann, wenn sie keine zusätzlichen Informationen (außer 32bits von int) verwendet:
Wir müssen f(0) = 0 haben. (Beweis: Nehmen wir an, f(0) = x. Dann ist f(x) = f(f(0)) = -0 = 0. Nun ist -x = f(f(x)) = f(0) = x, was bedeutet, dass x = 0 ist).
Außerdem ist für jede x
und y
angenommen, dass f(x) = y
. Wir wollen f(y) = -x
dann. Und f(f(y)) = -y => f(-x) = -y
. Zusammengefasst: Wenn f(x) = y
dann f(-x) = -y
und f(y) = -x
und f(-y) = x
.
Wir müssen also alle ganzen Zahlen außer 0 in 4er-Gruppen aufteilen, aber wir haben eine ungerade Anzahl solcher Zahlen; nicht nur das, wenn wir die ganze Zahl entfernen, die kein positives Gegenstück hat, haben wir immer noch 2(mod4) Zahlen.
Wenn wir die 2 verbleibenden Maximalzahlen entfernen (durch abs-Wert), erhalten wir die Funktion:
int sign(int n)
{
if(n>0)
return 1;
else
return -1;
}
int f(int n)
{
if(n==0) return 0;
switch(abs(n)%2)
{
case 1:
return sign(n)*(abs(n)+1);
case 0:
return -sign(n)*(abs(n)-1);
}
}
Natürlich gibt es auch die Möglichkeit, die 0 nicht einzuhalten und die 2 Zahlen, die wir entfernt haben, als Bonus zu erhalten. (Aber das ist nur ein dummes Wenn.)
6 Stimmen
Um welche Stelle ging es bei diesem Vorstellungsgespräch?