Gegeben eine Ganzzahl und ihre Darstellung in einem beliebigen Zahlensystem. Der Zweck ist, die Basis des Zahlensystems zu finden. Zum Beispiel ist die Zahl 10 und die Darstellung ist 000010, dann sollte die Basis 10 sein. Ein anderes Beispiel: Nummer 21-Darstellung ist 0010101 dann Basis ist 2. Ein weiteres Beispiel ist: Nummer ist 6 und die Darstellung ist 10100, dann ist die Basis sqrt (2) . Hat jemand eine Idee, wie man ein solches Problem lösen kann?Wie die Basis einer Nummer zu bestimmen?
Antwort
Ein Algorithmus wie dies sollte die Basis zu finden, wenn es eine ganze Zahl ist, und für eine nicht-ganzzahligen Basis, um die Auswahl zumindest einschränken sollte:
N
Ihre ganze Zahl sein lassen undR
seine Darstellung sein in die geheimnisvolle Basis.- Suchen Sie die größte Ziffer in
R
und nennen Sie sier
.- Sie wissen, dass Ihre Basis mindestens
r + 1
ist.
- Sie wissen, dass Ihre Basis mindestens
- Für
base == (r+1, r+2, ...)
, lassenI
R
in der Basis interpretiert repräsentierenbase
- Wenn
I
N
gleich, dannbase
ist Ihr Geheimnis Basis. Wenn die NummerI
kleiner alsN
ist, versuchen Sie die nächste Basis. - Wenn
I
größer alsN
ist, liegt Ihre Basis irgendwo zwischenbase - 1
undbase
.
- Wenn
Es ist eine Brute-Force-Methode, aber es sollte funktionieren. Sie können es auch etwas beschleunigen, indem Sie base
um mehr als eins erhöhen, wenn I
wesentlich kleiner ist als N
.
etwas anderes, das die Dinge beschleunigen könnte, insbesondere im Fall einer nicht ganzzahligen Basis: Denken Sie daran, dass mehrere Personen eine Zahl in einer beliebigen Basis erwähnt haben, kann als ein Polynom wie
x = a[n]*base^n + a[n-1]*base^(n-1) + ... + a[2]*base^2 + a[1]*base + a[0]
erweitert werden
Bei der Bewertung potenzieller Basen müssen Sie nicht die gesamte Zahl konvertieren. Beginnen Sie damit, nur den größten Ausdruck zu konvertieren, a[n]*base^n
. Wenn das größer als x
ist, dann wissen Sie bereits, dass Ihre Basis zu groß ist. Ansonsten füge jeweils einen Begriff hinzu (von höchst signifikant zu niedrigstwertig). Auf diese Weise verschwenden Sie keine Zeit damit, Begriffe zu berechnen, nachdem Sie wissen, dass Ihre Basis falsch ist.
Auch gibt es einen anderen schnellen Weg, um eine mögliche Basis zu beseitigen. Beachten Sie, dass Sie neu ordnen, das obige Polynom Ausdruck und erhalten
(x - a[0]) = a[n]*base^n + a[n-1]*base^(n-1) + ... + a[2]*base^2 + a[1]*base
oder
(x - a[0]) = (a[n]*base^(n-1) + a[n-1]*base^(n-2) + ... + a[2]*base + a[1])*base
Sie kennen die Werte von x
und a[0]
(die „Einsen“ Ziffer, können Sie es interpretieren, unabhängig von Base). Was dies gibt Ihnen die zusätzliche Bedingung, die (x - a[0])
muss durch base
gleichmäßig teilbar sein (da alle Ihre a[]
Werte sind ganze Zahlen). Wenn Sie (x - a[0]) % base
berechnen und ein Ergebnis ungleich Null erhalten, dann kann base
nicht die richtige Basis sein.
Danke, ich benutze einen ähnlichen Ansatz, aber auf eine andere Weise, siehe ich werde. Posten Sie morgen. –
Sie nehmen an, dass "base" eine ganze Zahl ist (in diesem Fall ist das Problem trivial) ... Ich habe den gleichen Fehler gemacht, aber '@ evil.coder' hat ein Beispiel gegeben, wo' base' 'sqrt (2)' ist . –
@Matthieu M.- Im Falle einer nicht ganzzahligen Basis verkleinert dieser Algorithmus den Suchraum auf das Intervall zwischen zwei benachbarten Ganzzahlen. Sobald Sie diese Grenzen kennen, können Sie eine binäre Suche innerhalb dieses Bereichs durchführen, um Ihre Basis weiter einzugrenzen. Wenn Ihre Basis jedoch eine irrationale Zahl ist, wird dieser Prozess niemals konvergieren. – bta
Ich bin nicht sicher, ob dies effizient lösbar ist. Ich würde einfach versuchen, eine zufällige Basis zu wählen, um zu sehen, ob das Ergebnis bei der Basis kleiner, größer oder gleich der Zahl ist. Wenn es kleiner ist, wählen Sie eine größere Basis, falls es größer ist, wählen Sie eine kleinere Basis, ansonsten haben Sie die richtige Basis.
___
\
number = /__ (digit[i] * base^i)
Sie wissen number
, wissen Sie alle digit[i]
, man muss nur base
erfahren.
Ob eine Lösung dieser Gleichung einfach oder komplex ist, bleibt als Übung übrig.
+1 für geniale ASCII Kunst Σ. –
Lernen Sie Ihren Unicode. 'Σ (digit [i] * base^i)' – slacker
Sie ignorieren einige grundlegende Eigenschaften des Basissystems in der Größenordnung der zu summierenden Terme. Für jedes 'I', 'Basis^I> Σ (i = 0; i
Dies sollte Ihnen einen Ausgangspunkt geben:
eine Gleichung aus der Anzahl und Darstellung erstellen, Nummer 42 und represenation „0010203“ wird:
1 * base^4 + 2 * base^2 + 3 = 42
Jetzt lösen Sie die Gleichung den Wert zu erhalten von base
.
Ich denke nicht, dass eine Antwort für jeden Fall gegeben werden kann. Und ich habe tatsächlich einen Grund, so zu denken! =)
eine Zahl x, mit Darstellung a_6 a_5 a_4 a_3 a_2 a_1
in Basis B, die Basis zu finden, bedeutet
a_6 b^5 + a_5 b^4 + a_4 b^3 + a_3 b^2 + a_2 b^1 + a_1 = x.
Diese Lösung kann nicht generell durchgeführt werden, wie von Abel and Ruffini gezeigt. Sie können mit kleineren Zahlen glücklicher sein, aber wenn mehr als vier Ziffern beteiligt sind, werden die Formeln zunehmend hässlich.
Es gibt jedoch eine ganze Reihe guter Approximationsalgorithmen. Siehe here.
Da die Gleitkommatypen eine begrenzte Genauigkeit haben, ist dies numerisch lösbar. – slacker
Nur wenn Sie wissen, dass die Basis als Float dargestellt werden kann. Die meisten Basen können nicht. – Jens
+1 Ich bin mir ziemlich sicher, dass im zweiten Beispiel in der Frage die Basis tatsächlich -sqrt (2) ist. Ich habe keine Ahnung, wo der Fragesteller das Minuszeichen verloren hat, aber ... –
Ich denke, Sie müssen versuchen und verschiedene Basen überprüfen. Um effizient zu sein, könnte Ihre Ausgangsbasis max (Ziffer) + 1 sein, da Sie wissen, dass sie nicht weniger sein wird. Wenn das zu klein ist, verdoppeln Sie es, bis Sie es überschreiten, und verwenden Sie dann binäre Suche, um es einzugrenzen. Auf diese Weise sollte Ihr Algorithmus für normale Situationen in O (log n) laufen.
Ich habe einen Anfangspunkt von dir. Danke .. –
Mehrere der anderen Beiträge schlagen vor, dass die Lösung gefunden werden könnte, indem man die Wurzeln des Polynoms findet, das die Zahl darstellt. Diese werden natürlich im Allgemeinen funktionieren, obwohl sie eine Tendenz haben werden, negative und komplexe Basen sowie positive ganze Zahlen zu erzeugen.
Ein anderer Ansatz wäre, dies als Integer-Programmierungsproblem zu interpretieren und mit Branch-and-Bound zu lösen.
Aber ich vermute, dass der Vorschlag des Ratens und Testens schneller sein wird als jeder der klügeren Vorschläge.
Die Frage zeigt ein Beispiel für nicht-integrale Basis. Daher ist ganzzahlige Programmierung nicht anwendbar. –
Nur für Ganzzahlen ist es nicht so schwierig (wir können aufzählen).
Schauen wir uns 21
und seine Darstellung .
1 * base^4 <= 21 < (1+1) * base^4
Lasst uns die Zahlen für einige Basen erzeugen:
base low high
2 16 32
3 81 162
Generell haben wir N
als Σ repräsentiert eine i * Basis i. Unter Berücksichtigung I
die maximale Leistung, für die ein I ist nicht null haben wir:
a[I] * base^I <= N < (a[I] + 1) * base^I # does not matter if not representable
# Isolate base term
N/(a[I] + 1) < base^I <= N/a[I]
# Ith root
Ithroot(N/(a[I] + 1)) < base <= Ithroot(N/a[I])
# Or as a range
base in ] Ithroot(N/(a[I] + 1)), Ithroot(N/a[I]) ]
Im Falle eines ganzzahligen Basis, oder wenn Sie eine Liste der bekannten möglichen Basen, ich bezweifle, dass sie viele sein werden Möglichkeiten, damit wir sie einfach ausprobieren können.
Beachten Sie, dass es schneller sein kann, die Ithroot
von N/(a[I] + 1)
und iterieren von hier anstelle der Berechnung der zweiten (die nahe genug) sein sollte ... aber ich würde Mathe-Review auf dieses Bauchgefühl brauchen.
Wenn Sie wirklich keine Idee haben (versuchen, eine schwimmende Basis zu finden) ... nun, es ist ein bisschen schwieriger, denke ich, aber Sie können immer die Ungleichheit verfeinern (einschließlich ein oder zwei Begriffe) gleiche Eigenschaft.
Eines der Beispiele eines Fragestellers hat die Basis als sqrt (2). – AakashM
Da alle Ziffern streng nicht negativ sind, wenn die Basis auch als nicht negativ angenommen wird, handelt es sich um ein konvexes Optimierungsproblem mit einer eindeutigen Lösung.Sie haben einige gute und leicht zu findende Grenzen beschrieben, die binäre Suche (möglicherweise mit Interpolation statt gleicher Halbierung) kann von dort ausgehen. –
@Matthieu: Werden Sie den Boden und die Decke los und Sie werden mit nicht-ganzzahligen Zahlen in Ordnung sein, wie AakashM hervorhebt. –
- 1. Konvertieren einer Basis 10-Nummer in eine Basis 3-Nummer
- 2. Nummer Basis-Konvertierung mit Ausnahmebehandlung
- 3. Wie Tupeltypen zu bestimmen?
- 4. Wie die Anzahl der Themen für LDA zu bestimmen?
- 5. Byte-Array zu einer Nummer
- 6. Nummer zu einer einzigartigen Permutationszuordnung einer Sequenz, die Duplikate enthält
- 7. Wie man die Nummer einer Zelle hat?
- 8. Wie finde ich das Protokoll einer Nummer?
- 9. Wie varchar zu Nummer
- 10. radix sort basis zustand?
- 11. Wie umgehen Sie die Identifizierung der Basis-8-Nummer in Python?
- 12. Wie die k-ten kleinsten Nummer eines Kongruenzgenerator
- 13. Wie Android-Internetverbindung zu bestimmen?
- 14. Wie füge ich jede Nummer aus einer Liste zu einer Nummer hinzu?
- 15. FileSystemWatcher - wie zu bestimmen, wenn die Datei geschlossen ist?
- 16. Wie kann ich die Basis-URL einer Anwendung finden?
- 17. Wie kann ich die Standardcodierung in einer tragbaren Klassenbibliothek bestimmen?
- 18. Wie kann man die Breite einer mehrzeiligen Zeichenfolge zuverlässig bestimmen?
- 19. Java - Rekursionsprogramm - Konvertiere eine Basis 10 Nummer in eine beliebige Basis
- 20. Wie Funktionsnamen zu bestimmen, aus innerhalb einer Funktion
- 21. Wie kann Visual Studio die Version einer Lösungsdatei bestimmen?
- 22. sql Änderungsrate der Daten zu bestimmen, setzen
- 23. Javascript konvertieren Puffer zu einer Nummer
- 24. In Qt, wie die Größe des Bildschirms zu bestimmen?
- 25. Wie doppelte Javascript-Funktionen bestimmen, die
- 26. Wie spalte ich eine einzelne Nummer von einer großen Nummer?
- 27. wie zu bestimmen, ob Webseite geändert wurde
- 28. Wie die meisten Krümmungspunkte eines Graphen in Python zu bestimmen
- 29. Wie zu bestimmen, dass die Eingabe (Stdin) unterbrochen ist?
- 30. bestimmen die Pfaddatei speichern
Hausaufgaben? ........... –
Einfach. Alle Zahlen sind Basis 10. – slacker
Eine Reihe von Lösungen (zu großartig, um sie alle zu kommentieren) haben dies als eine allgemeine polynomische Gleichung behandelt ... eine ganz spezielle Einschränkung der Basissysteme ignorierend: für jedes 'I',' Base^I> Σ (i in [0, I [) (Ziffer [i] * Basis^i) '. Diese Eigenschaft macht es viel einfacher, ich habe es in einer Antwort illustriert, weil mir hier der Platz für Gleichungen fehlte, aber es vereinfacht das Problem erheblich. –