Algorithmus für die Erkennung von sich wiederholenden Nachkommastellen?
Gibt es einen Algorithmus, um herauszufinden, die folgenden Dinge?
- Wenn das Ergebnis einer division ist eine wiederholte decimal (Binär).
- Wenn es wiederholt, was bei Ziffer (dargestellt als eine Potenz von 2) ist die Wiederholung starten?
- Welche Ziffern wiederholen?
Einige Beispiele:
1/2 = 1/10 = 0.1 //1 = false, 2 = N/A, 3 = N/A, 4 = N/A
1/3 = 1/11 = 0.010101... //1 = true, 2 = -2, 3 = 10
2/3 = 10/11 = 0.101010... //1 = true, 2 = -1, 3 = 10
4/3 = 100/11 = 1.010101... //1 = true, 2 = 0, 3 = 10
1/5 = 1/101 = 0.001100110011... //1 = true, 2 = -3, 3 = 1100
Gibt es eine Möglichkeit, dies zu tun? Effizienz ist ein großes Anliegen. Eine Beschreibung des Algorithmus würde bevorzugt über code, aber was nehm ich Antwort die ich bekommen kann.
Es ist auch erwähnenswert, dass die Basis keine große Sache; ich konvertieren kann der Algorithmus über binäre (oder wenn es, sagen wir mal Basis 256 zu verwenden char
s für Leichtigkeit, ich könnte einfach). Ich sage das, weil, wenn Sie erklären, wäre es einfacher für Sie, um zu erklären, in der Basis 10 :).
- Welche Bedingungen haben Sie benutzt, um das Ergebnis zu erhalten? Warum werden nicht die Ziffern, die wiederholt werden "01", "01", "10" und "0011"?
Meine Argumentation war, um 1 das erste, weil die führenden Nullen sind nicht [signifikanten][1], während nachgestellte Nullen sind. Wenn die Anzahl waren so etwas wie, "111.010101...", die sich wiederholenden Nummern "01", weil in diesem Fall die erste 0 ist signifikant. [1]:en.wikipedia.org/wiki/Significant_digits
Das ist nicht wichtig für mich, obwohl. Wenn Sie mir sagten, wie Sie dies tun in einer Weise, die zurückgegeben "01", "01", "01" und "0011" ich wäre glücklich. 🙂
Klingt wie projecteuler.net/problem=26 😉
Meine Argumentation war, um 1 das erste, weil die führenden Nullen sind nicht [signifikanten][1], während nachgestellte Nullen sind. Wenn die Anzahl waren so etwas wie, "111.010101...", die sich wiederholenden Nummern "01", weil in diesem Fall die erste 0 ist signifikant. [1]:en.wikipedia.org/wiki/Significant_digits
Das ist nicht wichtig für mich, obwohl. Wenn Sie mir sagten, wie Sie dies tun in einer Weise, die zurückgegeben "01", "01", "01" und "0011" ich wäre glücklich. 🙂
Klingt wie projecteuler.net/problem=26 😉
InformationsquelleAutor Imagist | 2009-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden, die sich wiederholenden Muster, verfolgen Sie die Werte, die Sie verwenden, entlang der Linie:
So erreichen Sie den gleichen Wert wie an der zweiten bit, wird der Vorgang einfach wiederholen, von diesem Zeitpunkt produzieren die gleiche bit-Muster über und über. Sie haben das Muster "0011" die Wiederholung aus dem zweiten bit (das erste nach dem Dezimaltrennzeichen).
Wenn Sie wollen, die Muster beginnen mit einer "1", können Sie einfach drehen, bis es passt, Zustand:
Edit:
Beispiel in C#:
Genannt, mit Ihrem Beispiele gibt es:
5/6 = 101/110 = 0.11010101010101010... Wenn Sie FindPattern(5,6) es finden die Muster zu wiederholen aus Ziffer -2 mit der Länge 2.
Es dauerte eine kleine Weile, um zu verstehen, dein code weil ich nicht weiß, C# ist sehr gut, aber ich denke, das ist genau das, was ich suchte. Ich Schreibe dies in C++ und die Anzahl Lagerung ist nicht genau so, aber es sollte einfach genug, um port diese über. Ich danke Ihnen sehr für Ihre Hilfe!
+1 und akzeptiert. 🙂
InformationsquelleAutor Guffa
InformationsquelleAutor Steve Gilham
Kann ich einen Tipp geben - sich wiederholende Dezimalstellen in der Basis zehn sind alle Bruch mit dem Nenner mit mindestens einem prime, andere Faktoren als die zwei und die fünf. Wenn der Nenner enthält keine Primfaktoren zwei oder fünf ist, können Sie immer dargestellt werden mit einem Nenner von allen Neunen. Dann wird der Zähler ist der sich wiederholende Teil und die Anzahl der Neunen ist die Länge der sich wiederholenden Teil.
Ob es Primzahlen sind Faktoren, die zwei oder fünf in den Nenner, der die Wiederholung beginnt der Teil, der nicht an der ersten Stelle.
Aber ich kann mich nicht erinnern, wie zur Ableitung der nicht-wiederholenden Teil und seine Länge.
Diese scheinen gut übersetzen zu Basis zwei. Nur die Fraktion mit einer Leistung von zwei Nenner sind nicht zu wiederholen. Dies kann leicht überprüft werden, indem man behauptet, dass nur ein einziges bit in den Nenner gesetzt wird.
Alle Fraktionen mit ungeradem Nenner sollte die Wiederholung und die Muster und kann in der Länge erhalten werden, indem man den Bruch mit einem Nenner der form
2^n-1
.Als für die Basis zehn ist, kann ich nicht sagen, wie Sie zu behandeln Nenner enthält, aber nicht eine Potenz von zwei sein - zum Beispiel 12 =
3 * 2^2
.InformationsquelleAutor Daniel Brückner
Zunächst eines Ihrer Beispiele ist falsch. Der sich wiederholende Teil der
1/5
ist0011
eher als1100
, und es beginnt am Anfang der gebrochene Teil.Einer sich wiederholenden dezimal ist so etwas wie:
a/b = c + d(2-n + 2-n-k + 2-n-2k + ...)
= c + 2-n * d /(1 - 2-k)
in die
n
undd
sind, was Sie wollen.Beispielsweise
könnte dargestellt werden durch die Formel mit
a = 1, b = 10(dec), c = 0, d = 0.0011(bin), n = 1, k = 4;
(1 - 2-k) = 0.1111
Daher
1/10 = 0.1 * 0.0011/0.1111
. Der Schlüssel Teil einer sich wiederholenden dezimal-Darstellung generiert wird, die durch Division durch(2n - 1)
oder seine vielfachen von 2. So können Sie entweder einen Weg finden, um auszudrücken, Ihre Nenner als solche (wie Bau-Konstanten-Tabellen), oder eine große Zahl division (die ist relativ langsam) und finde die Schleife. Es gibt keinen schnellen Weg, dies zu tun.Eigentlich gibt es bessere Möglichkeiten gegeben, Ihren Zweck: Sie können rationale zahlen in Bruch-form statt ausgebaut werden, oder Sie können einfach tun, die Mathematik in der Basis 10. Verarbeitung von sich wiederholenden Dezimalstellen ist nicht ganz einfach, da ich mir vorstellen könnte. 🙂
InformationsquelleAutor Todd Li
Check-out Nachkommastellen, und insbesondere über den Zeitraum von einem Bruchteil.
InformationsquelleAutor Nick Dandoulakis
Können Sie eine lange division, wobei die Reste. Die Struktur der Reste wird Ihnen die Struktur eines rational dezimal:
Im Allgemeinen die Entfernungen geben Sie die Menge der Ziffern, die für jedes Teil.
Sie können sehen, dass dieser Algorithmus codiert in C++ in der Methode
decompose()
hier.Versuchen
228142/62265
, es hat über einen Zeitraum von 1776 Ziffern!InformationsquelleAutor Heiko Schäfer