Wie kann man feststellen, ob eine Zahl ungerade oder gerade ist, ohne mod- oder bitweise Operationen?
Diese Herausforderung ist äußerst ineffizient, fordert jedoch Ihre Fähigkeit heraus, über den Tellerrand hinauszudenken, um eine kreative Lösung zu finden.
EDIT :
Bitte erstellen Sie eine Funktion. Auch wenn Regex eine unterhaltsame Antwort ist, sollte die Funktion jede gültige Zahl akzeptieren .
HINTERGRUND : Diese Frage stammt aus meinen frühesten Programmiertagen. Die Hausaufgabe für unseren ersten Unterrichtstag bestand darin, ein einfaches Programm zu schreiben, das "ungerade" oder "gerade" druckte. Da ich der Balg war, habe ich das Buch, das wir für die Klasse hatten, nicht gelesen. Es zeigte uns einfach, wie man%
das bestimmt. Ich verbrachte ungefähr eine halbe Stunde damit, in meinem Zimmer auf und ab zu gehen, und hatte in der Vorlesung daran gedacht, dass Zahlen an Präzision verlieren und zunehmen können, wenn sie von einem primitiven Typ zum nächsten gewechselt werden. Wenn Sie also die Zahl nehmen, durch zwei teilen und dann zurückmultiplizieren, entspricht dies nicht der ursprünglichen Zahl, und Sie würden wissen, dass die Zahl ungerade ist.
Ich war am nächsten Tag fassungslos, als unser Ausbilder unsere Programme evaluierte. Er fand, dass dies die originellste, wenn auch ineffizienteste Art war, das Problem zu lösen.
quelle
Antworten:
In den meisten Programmiersprachen gibt die Division den Quotienten für ganze Zahlen zurück. Sie können dies also einfach überprüfen
quelle
int
/long
Typfloor()
. Das funktioniert perfekt in C und C ++.Python
quelle
Brainf *** (179)
Dies ist eines der interessanteren Probleme mit der bedingten Logik, die ich in BF gemacht habe.
Es dauert eine Texteingabe mit einer Nummer. Wenn die Zahl gerade ist, wird sie ausgegeben
E
, und wenn sie ungerade ist, wird sie ausgegebenO
.Ich bin stolz genug darauf, dass ich eine besser lesbare Form zeigen werde:
quelle
Mathematica
quelle
I
undPi
anstelle voni
und verwendenpi
.C
Wird eine gerade Zahl ein paar Mal für sich multipliziert, läuft sie bei einer Ganzzahl mit endlicher Größe auf 0 über, und für eine ungerade Zahl wird weiterhin mindestens das niedrigstwertige Bit gesetzt.
Edit: Als einfache Funktion:
quelle
Python (langsam)
quelle
abs()
am Anfang einen Anruf hinzufügen .JavaScript
ergibt
true
eine gerade Zahl. Dies funktioniert nur mit Ganzzahlen von angemessener Größe (z. B. keine wissenschaftliche Notation, wenn sie in eine Zeichenfolge konvertiert wurde und keinen Bruchteil enthält).quelle
/[02468]$/.test
./[02468]$/.test('I am a fake even number 0')
. In diesem Fall könnten Sie tun/^[0-9].[02468]$/.test(i)
/-?^\d*[02468]$/
wäre etwas strenger als dein regulärer Ausdruck. Sie würden mehr Arbeit benötigen, damit dies für Zahlen, die in wissenschaftlicher Notation eingegeben werden, richtig funktioniert.Python
Da ich mir nicht sicher bin, was die Bewertungskriterien sind, sind hier einige Lösungen, die ich mir zum Vergnügen ausgedacht habe. Die meisten von ihnen
abs(n)
unterstützen negative Zahlen. Die meisten, wenn nicht alle, sollten niemals für echte Berechnungen verwendet werden.Dieser ist irgendwie langweilig:
Und dies ist mein Favorit, obwohl es leider nicht funktioniert (wie von March Ho unten ausgeführt: Nur weil alle geraden Zahlen die Summe von zwei Primzahlen sind, heißt das nicht, dass nicht alle ungeraden Zahlen sind).
quelle
Haskell
Dies ist natürlich keineswegs die kreative Lösung, nach der Sie über den Tellerrand schauen, aber wie oft werde ich tatsächlich eine Haskell-Antwort veröffentlichen, die kürzer als GolfScript ist? Es ist wirklich eine Schande, dass dies kein Code-Golf ist.
Aber im Ernst:
quelle
odd
), der eine eingebaute Funktion ist, die True zurückgibt, wenn die Zahl ungerade ist. Das ist eine vollständige Antwort für sich und kürzer als die aktuelle GolfScript-Antwort (die zum Zeitpunkt des Schreibens 10 Zeichen beträgt, aber ich gehe davon aus, dass sie sinken wird). Die Frage ist auch ein bisschen unterbestimmt, weshalb ich dasodd
für ausreichend halte . Das kann sich auch ändern.parity
funktioniert der Algorithmus auf allenNum
Instanzen, die Ganzzahlen sind. Das ist heiß! Obwohl ich es wahrscheinlich getan hätteevens = [0,2..] >>= \n -> [-n, n]
. Ähnliches gilt für Quoten.Anhand einer absichtlich perversen Lesart der Frage "Wie kann man feststellen, ob eine Zahl gerade oder ungerade ist?" Folgt eine C-Implementierung (vorausgesetzt
bool
undtrue
entsprechend definiert):quelle
0.5
kehrt zurück,true
wenn es nicht sollte.Was, noch keine randomisierten Algorithmen?
C
Zahlen im Bereich von 0 .. n -1 werden zufällig gepaart, bis weniger als 2 übrig sind. Es ist ganz erstaunlich ineffizient: O ( n 3 ).
Völlig anders:
Haskell
Verwendet die Tatsache, dass die Fouriertransformation einer geraden Funktion (zB
\x->x^^4
) real ist, während die Fouriertransformation einer ungeraden Funktion imaginär ist.quelle
Windows PowerShell
Keine bitweisen Operatoren, kein Modul, wie gewünscht.
quelle
Coq, 103
Soweit ich weiß, ist dies der erste CoQ-Eintrag zu Codegolf.
Noch kürzer (59):
quelle
Rubin
Wenn Sie das Ergebnis ausdrucken möchten:
quelle
.odd?
definition.Unlambda
Die Welt braucht mehr Unlambda.
Unlambda hat hier einen Killer-Vorteil: Die Standarddarstellung ( Ahem ) für Zahlen sind kirchliche Zahlen. Alles, was Sie also brauchen, ist, sie auf die Funktion binary anzuwenden - nicht auf true. Einfach!
PS: Markdown und Unlambda sind definitiv nicht aufeinander abgestimmt.
Überprüfung für die ersten ganzen Zahlen:
quelle
Golfscript
quelle
Python
Ähnliche Leistung wie die frühere Version. Funktioniert jetzt für 0.
Inkorrekte frühere Version:
Nicht besonders effizient; Zeit und Gedächtnis beide offensichtlich O (n): 32 ms für 1.000.000; 2,3 ms für 100000; 3,2 usec für 100. Funktioniert mit negativen Zahlen. Wirft einen Fehler für 0, da 0 weder gerade noch ungerade ist.
quelle
Fractran
angewendet
ergibt entweder
5
wennn
ungerade oder1
wenn geraden
ist.Update : Viel kürzer aber nicht so interessant:
ist
2
für ungeraden
und1
für geraden
.quelle
MMIX (4 Bytes)
Das ist eine Art Betrug. Ich benutze weder Mod- noch Bit-Fiddling-Operationen. Es ist eher so, dass das Testen auf ungerade / gerade Zahlen eingebaut ist. Angenommen, das
$3
enthält die zu testende Zahl und das Ergebnis geht in$2
:setzt
$2
auf1
if$3
ist gerade und auf0
wenn nicht. Die mnemnoricZSEV
Mittel Nullsatz selbst und hat folgende Semantik:Für die obige Zeile
mmixal
Generiert diese vier Assembler-Bytes:quelle
Planen
Dies ist die ineffizienteste Lösung, die ich kenne.
quelle
Perl
Wie wäre es mit
quelle
JavaScript, 36
Gibt zurück,
true
wenn gerade,false
wenn nicht.quelle
Perl
quelle
Python
Testen Sie das Quadrat von i, damit es auch für negative Zahlen funktioniert
quelle
F #
Gegenseitige Rekursion um den Sieg.
Eine Zahl n ist gerade, wenn sie Null ist oder (n-1) ungerade ist.
Eine Zahl n ist ungerade, wenn sie ungleich Null ist und (n-1) gerade ist.
(abs hinzugefügt, falls jemand an der Parität negativer Zahlen interessiert ist)
quelle
Clojure
quelle
Was ist eine bitweise Operation? Unter der Haube wird die Ganzzahldivision durch 2 wahrscheinlich als Bitverschiebung implementiert.
Vorausgesetzt, es gibt keine Bitverschiebungen:
C / C ++
edit Verpasste einige Klammern und wurde letztendlich geändert, um eine Verschiebung zu entfernen, damit sie weniger funktioniert. Sie können dies mit den folgenden (in * nix) testen:
... obwohl ich in Linux / tcsh den Backslash on umgehen musste,
\n
obwohl er in einfachen Anführungszeichen stand. Ich habe in Little & Big-Endian getestet, es funktioniert in beiden Fällen korrekt. Auch das habe ich von Hand kopiert; Der Computer, auf dem ich poste, hat keinen Compiler, daher kann er Fehler enthalten.x86 asm
.
oder
oder
... gefolgt von:
Alternativ könnte das Shift & Compare-Zeug auch so gemacht werden:
quelle
shl
und Freunde sind nichtAuf einem 68000-Prozessor können Sie einen Wortwert von der Adresse verschieben, die durch den zu testenden Wert definiert ist:
und lassen Sie die Hardwarefalle für Adressfehler die ungerade / gerade Art des Werts bestimmen - wenn die Ausnahme ausgelöst wird, war der Wert ungerade, wenn nicht, war der Wert gerade:
Funktioniert nicht auf Intel x86-CPUs, da diese beim Datenzugriff flexibler sind.
quelle
Python
Ich entschied mich für die hässlichste und verwirrendste Lösung, die ich mir vorstellen konnte:
Druckt e wenn gerade, o wenn ungerade.
quelle
Q.
Subtrahiere 2 so lange, bis x <2 ist, und konvertiere dann zu bool
quelle