Der Hintergrund
Also kennen wir alle den klassischen Beweis, der so aussieht:
a = b
a² = ab
a² - b² = ab - b²
(ab) (a + b) = b (ab)
(a + b) = b
b + b = b
2b = b
2 = 1 (Ha ha!)
von Natürlich ist der Fehler, dass Sie nicht durch 0 teilen können. Da a = b, a - b = 0, gab es eine versteckte Division durch 0.
Die Herausforderung
Sie müssen diesen Beweis replizieren. Erklären Sie zunächst zwei ganze Zahlen a und b (es ist egal, wie Sie sie nennen) als gleich. Dann deklarieren Sie aMod und bMod als änderbare Versionen von a und b und anfangs gleich a und b. Sie müssen beide mit a multiplizieren und dann b * b von beiden subtrahieren. Sie müssen dann durch a - b dividieren und dann durch b (oder a) dividieren, um zu erhalten. Drucken Sie dann aMod und bMod mit einem Gleichheitszeichen dazwischen aus.
Die Hinterhältigen
Da Sie a und b als gleich deklariert haben, verursacht a - b = 0 und Teilen durch 0 natürlich einen Fehler. Sie müssen es also kreativ vortäuschen. Da Sie versuchen, den Proof zu replizieren, darf das Ergebnis aller Operationen auf aMod und bMod beim Drucken nicht gleich sein. Sie müssen nicht genau 2 und 1 sein, sondern nur zwei Zahlen, die nicht gleich sind.
Hier ist ein Beispiel:
#include <iostream>
#define subtract(a, b) a - b
using namespace std;
int main()
{
int a = 4, b = 4;
int a_2 = a, b_2 = b;
a_2 *= a;
b_2 *= b;
a_2 -= b * b;
b_2 -= b * b;
a_2 = a_2 / subtract(a, b);
b_2 = b_2 / subtract(-b, -a); // a - b == (-b) - (-a)
a_2 /= a;
b_2 /= a;
cout << a_2 << " = " << b_2 << " because I did the same operations on both of them.";
return 0;
}
Vielleicht nicht die beste, aber sie verdeutlicht den Punkt.
Bonus Unterhand
Anstatt das Gleichheitszeichen auszudrucken, können Sie auch nur die beiden Variablen (aMod und bMod) ausdrucken und dann einen Code zum Vergleichen der beiden Variablen auf Gleichheit verwenden true
.
Denken Sie daran, dies ist ein Beliebtheitswettbewerb, daher gewinnt die höchste Anzahl von Upvotes.
Eine neue Version der Mathematik namens Mathematik 2.0 hat außerdem Standardlücken verwendet, die einen Beweis automatisch ungültig machen.
quelle
Antworten:
JavaScript
Ausgabe:
Beachten Sie, dass 0/0 = NaN
Hinweis
quelle
Python 2
Ich bin mir ziemlich sicher, dass es offensichtlich ist, da jeder Python kennt, aber hier ist mein Versuch:
Es gibt aus
True
.Hinweis:
quelle
Rubin
ideone
Hinweis:
Erläuterung:
quelle
GolfScript
Achtung: Dieses Programm schummelt ein wenig, da es nicht aMod und bMod druckt
Probieren Sie es hier aus !
So was ist los?
quelle
Prolog
Die Ausgabe, wenn
areEqual(4,4)
angerufen wird (oder irgendwelche anderen Zahlen wirklich):Warum?
quelle
JavaScript
Ausgabe:
http://jsbin.com/furino/2/edit?js,output JsBin scheint diesen Code nicht ausführen zu können. Verwenden Sie stattdessen die Browserkonsole.
Warum?
Ein weiteres JavaScript: Es folgt nicht genau den Regeln, sondern gibt nur aus, ob die Variablen gleich sind oder nicht.
Warum?
quelle
NaN
entspricht nicht denNaN
IEEE-Float-Spezifikationen. Ein schneller Weg, um zu testen, ob Sie einNaN
in C haben, ist, es mit sich selbst zu vergleichen. Das gilt also für alle Sprachen, nicht nur für JS.Fantom
Ausgabe:
Warum?
quelle
a
gleichb
am Ende haben.C
Der klassische Beweisfehler erfordert ein Missverständnis der klassischen C-Syntax. Leider habe ich einige "High-Level-Only" -Entwickler getroffen, die überzeugt sind, dass C aufgrund von Ergebnissen, die diesem Code ähneln, nicht funktioniert. Wenn Sie wissen, wie C funktioniert, wird dies ziemlich offensichtlich, aber wenn Sie den Code gesehen und angenommen haben, dass es sich um eine andere Sprache handelt, ist dies möglicherweise nicht der Fall.
Natürlich funktioniert es nicht ganz so gut, wenn es idiomatischer mit
#include <stdio.h>
und int's geschrieben wird, die vor den Deklarationen geworfen werden.quelle