Ihre Aufgabe ist es, die Quadratwurzel einer positiven Ganzzahl zu berechnen, ohne mathematische Operatoren zum Ändern der Zahl zu verwenden, z.
- Variable setzen (zB squareRoot = 5)
- Zusatz (A + B)
- Subtraktion (AB)
- Multiplikation (A * B)
- Abteilung (A / B)
- Quadrat-, Würfel-, vierte usw. Wurzeln
- Exponenten
Vergleichsoperatoren (wie <,>, == usw.) werden für die Zwecke dieser Frage nicht als "mathematische Operatoren" betrachtet und sind zulässig, solange sie den Wert einer Variablen nicht ändern.
Der einzige Operator, den Sie verwenden können, ist ++. Folgende Ausnahmen bestehen:
- Wenn Sie möchten, können Sie eine Variable initialisieren, indem Sie sie auf 0 setzen.
- Wenn Ihre Sprache die ++ - Syntax nicht enthält, können Sie eine äquivalente Syntax verwenden, z. B. foo + = 1 oder foo = foo + 1
- Die Quadratwurzel sollte mit mindestens 6 Stellen nach der Dezimalstelle (der Hunderttausenderstelle) berechnet und als ganze Zahl der Dezimalstellen ausgegeben werden (z. B. wenn ich 2 eingebe, könnte dies je nach Rundung 14142135624 oder 1414213 lauten). . Auf- oder Abrunden ist nicht wichtig.
Benutzerdefinierte Funktionen sind nicht erlaubt. Außerdem ist das Simulieren von Funktionen mit goto nicht erlaubt.
Ich bin gespannt, was alle einreichen! Viel Spaß beim Codieren!
KLÄRUNG
Stellen Sie sicher, dass diese Zahl eine positive ganze Zahl ist. Sie können gerne Code erstellen, der eine beliebige Zahl enthält, dies ist jedoch nicht erforderlich.
ERKLÄRUNG 2
Stellen Sie klar, dass Vergleichsoperatoren zulässig sind.
ERKLÄRUNG 3
Addition, Subtraktion, Multiplikation, Division und Funktionen Änderungsnummern sind nicht erlaubt überhaupt , und zwar unabhängig davon , ob sie zu einer Variablen gespeichert werden oder nicht. Es tut mir leid, dass dies ein paar vorhandene Antworten ungültig macht, aber ich wollte diese Gruppe von Operatoren mit "Nummer ändern" definieren, um Trollantworten zu verhindern (z. B. ich habe gerade die Funktion sqrt () verwendet, Sie haben nur das Hinzufügen verboten, Multiplikation, Division und Subtraktion). Entschuldigung für die Verwirrung.
ERKLÄRUNG 4
Stellen Sie sicher, dass wir mindestens 5 Ziffern benötigen. 10 Ziffern führten dazu, dass der Code lange Zeit ausgeführt wurde.
quelle
while r*r<n*10e20:r+=1
- ziemlich trivial. Sie können auch in Betracht ziehen, die erforderliche Ausgabe auf etwa 10 ^ 8 zu reduzieren. Erstens, weil 10 ^ 10 größer als 2 ^ 31 ist, und zweitens, weil es eine Weile dauern wird, bis das Hoch erhöht wird.Antworten:
Python 66
Ausgabe
quelle
int(...*1e10)
, sonst sehr schön. Die Einnahmeabs
eines komplexen Wertes ist jedoch mehr oder wenigersqrt
verdeckt.*1e10
...Python, 184 Zeichen
Die folgende Python-Lösung verwendet nur den Inkrement-Operator und überhaupt keine anderen arithmetischen Operatoren. Mit der erforderlichen Genauigkeit (10 Stellen) dauert die Ausführung jedoch unglaublich lange. Sie können es mit geringerer Präzision testen (3 Stellen) durch Reduktion
1e20
zu1e6
.Ungolfed:
quelle
Fortran 73
Es kann einige Zeit dauern, bis eine Antwort für bestimmte Werte gefunden wurde, aber es wird auf jeden Fall funktionieren. Während ich
*
und benutze-
, ändern diese keine Werte , nur dies=s+1
tatsächlich etwas.quelle
*
Operator verwendet, der eindeutig nicht zulässig ist. Oder verstehe ich die gegebenen Einschränkungen irgendwie falsch?*
Operator immer noch zum Ändern einer Zahl verwendet. Sie speichern das Ergebnis nur nirgendwo. Wenn das OP Zuweisungen (mit Ausnahme von) einfach nicht zulassen wolltes=s+1
, warum dann alle nicht zulässigen arithmetischen Operatoren erwähnen?CJam, 26 Bytes
Probieren Sie es online aus. Fügen Sie den Code ein , geben Sie die gewünschte Ganzzahl in die Eingabe ein und klicken Sie auf Ausführen . Bevor Sie das tun, empfehlen ändere ich
1e10
zu1e4
though.Der Java-Interpreter verarbeitet die
1e6
Eingabe "2" in ca. 15 Sekunden.1e20
wird eine große Menge an RAM benötigen .Beispiele
Hintergrund
Da es mathematischen Operatoren nicht erlaubt ist, Zahlen zu ändern, werden wir Setwise-Operatoren verwenden, um Arrays zu ändern.
Der Code beginnt mit der "Multiplikation" der Eingabe ("i") mit 1e20, jedoch ohne tatsächliche Multiplikation. Stattdessen pushen wir ein Array mit “i” ganzen Zahlen, ein Array mit 1e20 ganzen Zahlen, nehmen ihr kartesisches Produkt und berechnen dessen Länge.
Dann drücken wir Null und inkrementieren, bis das Produkt der ganzen Zahl für sich (wie oben berechnet) nicht mehr kleiner als ist
i * 1e20
. Dadurch wird die Quadratwurzel aufgerundet.Wie es funktioniert
quelle
Cobra - 62
Gepostet vor der dritten Bearbeitung, nicht mehr gültig.
Es ist nicht nur kurz, es sollte auch überlauffrei sein, wenn
n < Decimal.maxValue
quelle
r/e*r/e
, was eindeutig ein nicht++
mathematischer Operator ist ...Scala, 117
Ist nicht in angemessener Zeit fertig, auch nicht für 2 als Eingabe, aber es funktioniert. Sie werden vielleicht bemerken, dass ich es tue
_+_
, aber das fügt immer nur 1 hinzu und Scala hat++
sowieso keinen Operator. Ich könnte zwei Zeichen speichern, indem ich den inneren Stream durch List ersetze, aber dann würde der Speicher knapp. Wie geschrieben, denke ich, skaliert es nur in der Verarbeitungszeit, nicht in der Speichernutzung.quelle
Haskell, 70 Bytes
f
Gibt die ganzzahlige Quadratwurzel an, indem die größte Zahl ermittelt wird, deren Quadrat kleiner oder gleich der Eingabe ist. Die Quadrierungsfunktions i
erhöht sich für jedes Element einer(i,i)
Matrix um eins . (Am Telefon getippt, könnte also Tippfehler enthalten).quelle
PHP, 124 Bytes
Es ist ein vollständiger Algorithmus. Es werden nur Zahlen ausprobiert, bis das Quadrat dieser Zahl größer ist als die "Ziel" -Zahl (das sind die Eingabezeiten 1E im
number of decimals
Quadrat (10.000 für ein Ergebnis mit zwei Dezimalstellen). Anschließend wird die letzte Zahl gedruckt.Laufen Sie wie folgt (
-d
nur aus ästhetischen Gründen hinzugefügt):Versuchen Sie dies nicht mit mehr als 3 Dezimalstellen oder einer Zahl über 10.
quelle