Tło
Wszyscy znamy klasyczny dowód, który wygląda następująco:
A = B
a² = AB
a² - b² = AB - b²
(ab), (A + B) = b (ab),
(A + B) = b
b + b =
2b = B
2 = 1 (Ha!)
O Oczywiście błąd polega na tym, że nie można podzielić przez 0. Ponieważ a = b, a - b = 0, więc podział był ukryty przez 0.
Wyzwanie
Musisz powtórzyć ten dowód. Najpierw zadeklaruj dwie liczby całkowite a i b (nie ma znaczenia, jak je nazwiesz) równe. Następnie zadeklaruj aMod i bMod jako modyfikowalne wersje aib, początkowo równe odpowiednio aib. Musisz je pomnożyć przez a, a następnie odjąć b * b od obu. Musisz podzielić przez -b, a następnie podzielić przezb (lub a), aby uzyskać. Następnie wydrukuj aMod i bMod ze znakiem równości między nimi.
Podstępni
Oczywiście, ponieważ zadeklarowałeś aib równe, a - b = 0, a dzielenie przez 0 powoduje błąd. Musisz więc kreatywnie to sfałszować. Ponadto, ponieważ próbujesz odtworzyć dowód, wynik wszystkich operacji na aMod i bMod nie może być równy po wydrukowaniu. Nie muszą równać się dokładnie 2 i 1, tylko dwie liczby, które nie są równe.
Oto przykład:
#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;
}
Może nie najlepszy, ale ilustruje sens.
Bonus Underhanded
Zamiast drukować znak równości, możesz wydrukować tylko dwie zmienne (aMod i bMod), a następnie mieć kod, który wydaje się porównywać dwie zmienne pod kątem równości, ale w rzeczywistości leży, że są one równe (i drukuje jakąś formę true
).
Pamiętaj, że jest to konkurs popularności, więc wygrywa najwyższa liczba głosów pozytywnych.
Ponadto nowa wersja matematyki o nazwie Mathematics 2.0 wykorzystała standardowe luki automatyczne unieważniające dowód.