Beenden, rein periodisch oder schließlich periodisch?


21

Einführung

Eine Dezimalstelle endet, wenn sie eine endliche Anzahl von Dezimalstellen hat. Beispielsweise endet 0,4 (2/5), weil es eine Dezimalstelle hat.

Eine Dezimalstelle ist rein periodisch, wenn sie eine unendliche Anzahl von Dezimalstellen und keine Dezimalstellen vor ihrer Wiederholung aufweist (der sich wiederholende Teil der Dezimalstelle). Beispiel: 0,142857142857142… (1/7) ist rein periodisch, weil sie eine Wiederholung aufweist 142857, die unmittelbar nach dem Komma wiederholt wird.

Eine Dezimalstelle ist schließlich periodisch, wenn sie eine unendliche Anzahl von Dezimalstellen und eine endliche Anzahl von Dezimalstellen vor ihrer Wiederholung aufweist (der sich wiederholende Teil der Dezimalstelle). Beispiel: 0,16666666666666666… (1/6) ist schließlich periodisch, weil seine repetend 6 beginnt nach einer 1 zu wiederholen.

Deine Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die bei Angabe der Zahlen p und q (ganze Zahlen, 0 <= p < q <= 100) bestimmt, ob die Dezimaldarstellung von p / q terminiert, rein periodisch oder schließlich periodisch ist.

Sie müssen ausgegeben , awenn es Terminating (dh 0,1), bwenn es rein Periodic (dh 0,333 ...), oder cwenn es schließlich Periodic (dh 0,166 ...), wo a, bund csind alle verschieden, konstante Strings Ihrer Wahl.

Testfälle

0/1 => Terminating
0/2 => Terminating
1/2 => Terminating
0/3 => Terminating
1/3 => Purely Periodic
2/3 => Purely Periodic
0/4 => Terminating
1/4 => Terminating
2/4 => Terminating
3/4 => Terminating
0/5 => Terminating
1/5 => Terminating
2/5 => Terminating
3/5 => Terminating
4/5 => Terminating
0/6 => Terminating
1/6 => Eventually Periodic
2/6 => Purely Periodic
3/6 => Terminating
4/6 => Purely Periodic
5/6 => Eventually Periodic
0/7 => Terminating
1/7 => Purely Periodic
2/7 => Purely Periodic
3/7 => Purely Periodic
4/7 => Purely Periodic
5/7 => Purely Periodic
6/7 => Purely Periodic
0/8 => Terminating
1/8 => Terminating
2/8 => Terminating
3/8 => Terminating
4/8 => Terminating
5/8 => Terminating
6/8 => Terminating
7/8 => Terminating
0/9 => Terminating
1/9 => Purely Periodic
2/9 => Purely Periodic
3/9 => Purely Periodic
4/9 => Purely Periodic
5/9 => Purely Periodic
6/9 => Purely Periodic
7/9 => Purely Periodic
8/9 => Purely Periodic
0/10 => Terminating
1/10 => Terminating
2/10 => Terminating
3/10 => Terminating
4/10 => Terminating
5/10 => Terminating
6/10 => Terminating
7/10 => Terminating
8/10 => Terminating
9/10 => Terminating
0/11 => Terminating
1/11 => Purely Periodic
2/11 => Purely Periodic
3/11 => Purely Periodic
4/11 => Purely Periodic
5/11 => Purely Periodic
6/11 => Purely Periodic
7/11 => Purely Periodic
8/11 => Purely Periodic
9/11 => Purely Periodic
10/11 => Purely Periodic
0/12 => Terminating
1/12 => Eventually Periodic
2/12 => Eventually Periodic
3/12 => Terminating
4/12 => Purely Periodic
5/12 => Eventually Periodic
6/12 => Terminating
7/12 => Eventually Periodic
8/12 => Purely Periodic
9/12 => Terminating
10/12 => Eventually Periodic
11/12 => Eventually Periodic
0/13 => Terminating
1/13 => Purely Periodic
2/13 => Purely Periodic
3/13 => Purely Periodic
4/13 => Purely Periodic
5/13 => Purely Periodic
6/13 => Purely Periodic
7/13 => Purely Periodic
8/13 => Purely Periodic
9/13 => Purely Periodic
10/13 => Purely Periodic
11/13 => Purely Periodic
12/13 => Purely Periodic
0/14 => Terminating
1/14 => Eventually Periodic
2/14 => Purely Periodic
3/14 => Eventually Periodic
4/14 => Purely Periodic
5/14 => Eventually Periodic
6/14 => Purely Periodic
7/14 => Terminating
8/14 => Purely Periodic
9/14 => Eventually Periodic
10/14 => Purely Periodic
11/14 => Eventually Periodic
12/14 => Purely Periodic
13/14 => Eventually Periodic
0/15 => Terminating
1/15 => Eventually Periodic
2/15 => Eventually Periodic
3/15 => Terminating
4/15 => Eventually Periodic
5/15 => Purely Periodic
6/15 => Terminating
7/15 => Eventually Periodic
8/15 => Eventually Periodic
9/15 => Terminating
10/15 => Purely Periodic
11/15 => Eventually Periodic
12/15 => Terminating
13/15 => Eventually Periodic
14/15 => Eventually Periodic

Sie können alle Testfälle finden hier .

Sie können Ihre eigenen 3 Werte für den Ausgang wählen, aber es muss klar sein, welcher es ist.

Denken Sie daran, dies ist , also gewinnt der Code mit der geringsten Anzahl von Bytes.

Hinweise

Beenden:

Die Primfaktorisierung des Nenners einer abschließenden Dezimalstelle besteht in einfachster Form nur aus 2s und 5s.

Rein periodisch:

Die Primfaktorisierung eines rein periodischen Dezimalnenners in einfachster Form enthält keine 2s oder 5s.

Eventuell periodisch:

Die Primfaktorisierung des Nenners einer eventuell periodischen Dezimalstelle enthält in einfachster Form mindestens eine 2 oder 5, aber auch andere Zahlen.

Bestenlisten

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

# Perl, 43 + 2 (-p flag) = 45 bytes

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes



2
Wenn ich gedacht hätte, dass es sich tatsächlich um ein Duplikat handelt, hätte ich eine enge Abstimmung abgegeben. Es gibt einen Grund, warum ich das Wort " fast " verwendet habe.
Peter Taylor

1
gegeben einen Bruch in der Form p / q gegeben wie? Können wir Zähler und Nenner als separate Funktionsargumente verwenden?
Dennis

2
Können wir einen nicht konstanten Wert ausgeben, der eine bestimmte Bedingung erfüllt, wie z. B. etwas Falsches zum Beenden, 1 für rein periodisch und etwas Größeres als 1 für eventuell periodisch?
ETHproductions

1
Nein, 1/13 ist rein periodisch, weil die Wiederholung '076923' ist. Die 0 wiederholt sich mit der Wiederholung.
Oliver Ni

Antworten:


8

Gelee , 10 Bytes

:gÆfḍ⁵ṢQ¬Ḅ

Akzeptiert Nenner und Zähler (in dieser Reihenfolge) als Argumente. Gibt 0 zum Beenden, 1 für rein periodisch und 2 für eventuell periodisch zurück. Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

:gÆfḍ⁵ṢQ¬Ḅ  Main link. Arguments: d (denominator), n (numerator)

 g          Compute the GCD of d and n.
:           Divide d by the GCD, yielding the denominator of the simplified form.
  Æf        Yield all prime factors of the previous result.
    ḍ⁵      Test 10 for divisibility by each prime factor.
            This yields 1 for 2 and 5, 0 for all other primes.
      Ṣ     Sort the resulting Booleans.
       Q    Unique; deduplicate the sorted Booleans.
        ¬   Logical NOT; replace 0 with 1 and vice versa to yield one of the
            following arrays.
              [    ]  <- no prime factors (denominator 1)
              [   0]  <- only 2 and 5
              [1   ]  <- neither 2 nor 5
              [1, 0]  <- mixed
         Ḅ  Unbinary; convert from base 2 to integer.
            This maps [] and [0] to 0, [1] to 1, and [1, 0] to 2.

11

JavaScript (ES6), 70 .. 68 53 Bytes

f=(a,b,s=[],x)=>a?(s[a]^=a)?f(a*10%b,b,s,x||a):x==a:0

Gibt 0 zum Beenden zurück, true für rein periodisch und false für eventuell periodisch.

Wie es funktioniert

Was wir hier tun, simuliert tatsächlich eine Teilung von Hand:

  1. a?...:0- Wenn der Zähler Null ist, stoppen wir hier und kehren zurück 0. Die Sequenz wird beendet .
  2. (s[a]^=a)?...:x==a- Wenn wir diesen Zähler bereits kennen, bedeutet dies, dass die Sequenz periodisch ist und sich für immer wiederholen wird. Wir stoppen hier und kehren entweder zurück, truewenn ader erste Wert xder Sequenz ( rein periodisch ) oder falsenicht ( schließlich periodisch ) ist.
  3. f(a*10%b,b,s,x||a)- Sonst multiplizieren wir den Zähler amit 10. Wir berechnen den Rest der Division durch den Nenner b. Und wir wiederholen den Vorgang, indem wir diesen Rest als neuen Zähler verwenden. (Wir übergeben auch aals ersten Wert der Sequenz, wenn es nicht bereits in gespeichert ist x.)

Beispiel

  • Blau : Zähler = 1
  • Grün : Nenner = 7
  • Rot : Multiplikationen mit 10
  • Schwarz : Reste
  • Grau : Quotientenziffern (sie interessieren uns hier nicht wirklich, und der obige Code berechnet sie überhaupt nicht)

Teilung


9

Python, 62 61 59 Bytes

f=lambda n,d,r=[0,0]:(r[:3]+r).count(n)or f(10*n%d,d,r+[n])

Druckt 1 für evtl. periodisch, 2 für rein periodisch und 4 zum Beenden.

Überprüfen Sie alle Testfälle auf repl.it .


Faszinierend! Was macht *rdas?
ETHproductions

Es packt das Tupel r aus . f(1, *(2, 3), 4)ist äquivalent zu f(1, 2, 3, 4).
Dennis

Das wären also 56 Bytes in JS:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

Meine schlechten 63 Bytes (ich habe vergessen, dass indas in JS einen ganz anderen Zweck f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
erfüllt

@ETHproductions Ordentlich. Ich denke, f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)würde auch funktionieren.
Dennis

6

Perl, 49 46 45 Bytes

Beinhaltet +3 für -p

Basierend auf Dennis 'eleganter Idee, aber perlmuttartig umgesetzt

Geben Sie bei STDIN die Eingangsnummern ein

terminating.pl <<< "2 26"

termninating.pl:

#!/usr/bin/perl -p
/ /;1until$a{$_=$_*10%$' or$`}++;$_=$a{$`}

Gibt beim Beenden eine 2 aus. 1 wenn periodisch und nichts wenn schließlich periodisch


Alle Zahlen einer bestimmten Gruppe müssen denselben Wert haben.
Oliver Ni

@ OliverNi Sie tun es jetzt
Ton Hospel

3

Batch, 247 Bytes

@set/af=%1,g=%2
:g
@if not %f%==0 set/ah=g,g=f,f=h%%g&goto g
@set/ae=d=%2/g
:l
@set/ag=-~!(d%%2)*(!(d%%5)*4+1)
@if not %g%==1 set/ad/=g&goto l
@if %d%==1 (echo Terminating)else if %d%==%e% (echo Purely Periodic)else echo Eventually Periodic

Benutzt meinen schnellen gcd10-Trick von Bruch bis zur exakten Dezimalstelle . Offensichtlich konnte ich eine Menge Bytes mit einem benutzerdefinierten Ausgabeformat speichern.


Warum @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Esparen Sie nicht einfach 42 Bytes?
ETHproductions

Offensichtlich konnte ich eine Menge Bytes mit einem benutzerdefinierten Ausgabeformat speichern.
Oliver Ni

@ETHproductions Ich glaube er will nicht, wie Oliver mit einem Zitat vermerkt hat.
Erik der Outgolfer

3

JavaScript (ES6), 91 88 85 79 75 74 78 Byte

f=(n,d,g=(a,b)=>b?g(b,a%b):a,t=g(d/=c=g(n,d),10))=>n*~-d?t-1?f(n/c,d/t)/0:1:+f

Ausgänge NaNzum Beenden, 1für rein periodische und Infinityfür eventuell periodische.

Testschnipsel

Erläuterung

Zunächst dividieren wir sowohl n als auch d durch gcd (d, n) , um den Bruch auf seine einfachste Form zu reduzieren. Auf diese Weise vermeiden wir Situationen wie 2/6, in denen das Ergebnis ansonsten als rein periodisch berechnet würde. Wir definieren auch die Variable t als gcd (d, 10) ; Dies wird später verwendet.

Die erste Prüfung ist , ob n ist 0 oder d ist 1 . Wenn n * (d-1) 0 ist, kehren wir zurück +foder NaN : Der Bruch endet .

Die nächste Überprüfung ist , ob t ist 1 . In diesem Fall geben wir 1 zurück : Der Bruch ist rein periodisch .

Wenn t ist nicht 1 , teilen wir d von t , führen die gesamte Funktion wieder und Dividieren durch 0. Wenn n / (d / t) ist , beendet wird , kehrt diese NaN / 0 = NaN : Die Fraktion wird beendet . Andernfalls wird 1/0 = Unendlich zurückgegeben : Der Bruch ist schließlich periodisch .


Wo ist die Reduktion auf die einfachste Form?
Ton Hospel

@TonHospel behoben.
ETHproductions

@ Arnauld Ich bin mir nicht sicher, was du meinst. Es wird Infinityfür alle diese Werte zurückgegeben.
ETHproductions

@Arnauld Aw, Mann, ich dachte, ich könnte durchkommen, ohne mich anzupassen n... Danke, dass du darauf hingewiesen hast .
ETHproductions

3

Mathematica, 41 Bytes

Ordering@{d=Denominator@#,GCD[d,10^d],1}&

{3,1,2}Wird ausgegeben, wenn der Eingang eine endende Dezimalerweiterung aufweist, {2,3,1}wenn der Eingang eine rein periodische Dezimalerweiterung aufweist und {3,2,1}wenn der Eingang eine eventuell periodische Dezimalerweiterung aufweist.

Basierend auf dem hinterhältigen Trick: Wenn dder Nenner eines Bruchs in niedrigsten Begriffen ist, dann ist der größte gemeinsame Teiler von dund 10^dgleich, dwenn dnur 2s und 5s in seiner Primfaktorisierung enthalten sind; ist gleich, 1wenn dweder 2s noch 5s in der Primfaktorisierung enthalten sind; und entspricht einer ganzen Zahl dazwischen, wenn d2s / 5s und andere Primzahlen vorliegen.

Die OrderingFunktion meldet nur, wo sich die kleinsten, nächstkleinsten und größten Elemente des Tripels befinden, wobei die Bindungen von links nach rechts unterbrochen sind.

Fehler: Gibt die variante Ausgabe zurück, {1,2,3}anstatt {3,1,2}wenn die Eingabe 0 ist.

Mathematica, 46 Bytes, pervers

b[a][[Log[d=Denominator@#,GCD[d,10^d]]]][[1]]&

Gibt zurück, a[[1]]wenn die Eingabe eine endende Dezimalerweiterung aufweist, b[[1]]wenn die Eingabe eine rein periodische Dezimalerweiterung aufweist und b[a]wenn die Eingabe eine eventuell periodische Dezimalerweiterung aufweist. Wirft auf jeden Fall einen Fehler!

Wie oben wollen wir wissen, ob dieser größte gemeinsame Teiler 1, d oder irgendwo dazwischen ist. Der Logarithmus zur Basis d dieses gcd ist gleich 0, 1 oder etwas dazwischen.

Jetzt fangen wir an, Mathematica zu quälen. b[a][[n]]bezeichnet den nth Teil des Ausdrucks b[a]. Also b[a][[1]]kehrt zurück a; b[a][[0]]kehrt zurück b; und b[a][[x]], wo xeine Zahl zwischen 0 und 1 ist, veranlasst Mathematica, den Fehler "Part :: pkspec1: Der Ausdruck xkann nicht als Teilespezifikation verwendet werden." und kehrt b[a][[x]]unbewertet zurück.

Dies unterscheidet die drei Fälle bereits angemessen, mit der Ausnahme, dass die Ausgabe für den schließlich periodischen Fall b[a][[x]]nicht konstant ist, da xes sich um den tatsächlichen Logarithmus von etwas handelt. Dann wenden wir uns [[1]]den bereits beschriebenen Ausgängen zu. Aufgrund der internen Darstellung von Mathematica b[a][[x]]ist das Ergebnis von b[a][[x]][[1]]einfach b[a]. Wenn Sie dagegen auf anwenden [[1]], awird ein anderer Fehler ausgegeben: "Part :: partd: Teilespezifikation a [[1]] ist länger als die Objekttiefe." und kehrt a[[1]]unbewertet (und ähnlich für b) zurück.

Fehler: Liegt an der Eingabe 0 und kehrt b[a]stattdessen zurück a[[1]].


2

C 173 Bytes

Nimmt zwei Ganzzahlen aus stdin, gibt 1 für rein periodisch, -1 für eventuell periodisch und 0 für das Beenden aus.

int r;main(_,n,d){_-1?_-2?d-1?d%2&&d%5?r=1:d%2?main(3,n,d/5):main(3,n,d/2),r=r?-1:0:r=0:d?main(2,d,n%d):r=n:scanf("%d %d",&n,&d),main(2,n,d),main(3,n/r,d/r),printf("%d",r);}

Ungolfed:

// returns 1 for periodic, 0 for terminating, <0 for eventually periodic
int periodic(int num, int den) { // 3
    if (den == 1) return 0;
    if (den % 2 && den % 5) // pure periodic
        return 1;
    if (den % 2) return periodic(num,den/5) ? -1 : 0;
    return periodic(num,den/2) ? -1 : 0;
}

int gcd(int num, int den) { // 2
    if (den) 
        return gcd(den,num%den);
    return num;
}

int main(n,d) // 1
{
    scanf("%d %d",&n,&d);
    printf("%d",periodic(n/gcd(n,d),d/gcd(n,d)));
    return 0;
}   

Halbgolf:

int r;main(_,n,d){
    _-1? 
    _-2?
    // periodic
    d-1?
        d%2&&d%5?
            r=1:
                d%2?
                    main(3,n,d/5): //periodic
                    main(3,n,d/2), //periodic
                        r=r?-1:0:
                r=0
    // gcd
    :d?main(2,d,n%d):r=n // gcd
    // main
    :scanf("%d %d",&n,&d),
     main(2,n,d), // gcd
     main(3,n/r,d/r), // periodic
     printf("%d",r);
}

2

Eigentlich 15 Bytes

Dies basiert auf Dennis 'Jelly-Antwort . 0 endet, 1 ist rein periodisch und 2 ist schließlich periodisch. Golfvorschläge sind willkommen. Probieren Sie es online!

▼Ny9u♀%SR♂b╔2@¿

Ungolfing

      Implicit input [a, b].
▼     Divide a and b by gcd(a,b).
Ny    Get the unique prime divisors of the reduced denominator.
9u    Push 10.
♀%    10 mod every member of uniq_p_d.
SR    Sort the mods and reverse.
♂b    Logical buffer. Converts every (10 % p != 0) to 1, and everything else to 0.
        Meaning if 2 or 5 divided b, they are now 0, and every other prime is now 1.
╔     Uniquify the list.
        If terminating, return [0].
        If purely periodic, return [1].
        If eventually periodic, return [1, 0].
        Else, (if b was 1), return [].
2@¿   Convert from binary to decimal. Return 0, 1, or 2.
      Implicit return.

1

Mathematica, 44 Bytes

If[ListQ@Last@#,Length@#==1]&@@RealDigits@#&

Gibt Nullfür Terminating, Truefür rein periodische und Falsefür eventuell periodische zurück.

Erläuterung

RealDigits

Finden Sie die Dezimalerweiterung von N. (wiederholte Ziffern sind von einem zusätzlichen Kopf umgeben List {}).

ListQ@Last@#

Überprüfen Sie, ob das letzte Element der Dezimalerweiterung a ist List.

Length@#==1

Wenn die obige Bedingung erfüllt ist True, überprüfen Sie, ob die gesamte Dezimalerweiterung aus einer Sache besteht. (A Listzählt als eine Einheit). (Rückgabe Trueoder False)

(Wenn die Bedingung lautet False, Nullwird a zurückgegeben, da es kein drittes Argument für gibt. If)


1

Pyth , 31 27 Bytes

AQ={P/HiGH?l@H=j25T?l-HT1Z2

Eingang

4,12

Sie können es hier ausprobieren . Gibt 1 für evtl. periodisch, 2 für rein periodisch und 0 zum Beenden aus. Ich antworte zum ersten Mal mit Codegolf. Anregungen sind willkommen.

Erläuterung

AQ                                              // 1st element to G and 2nd element to H
    ={P                                         // Assign unique prime factors to H
        /H                                      // Simplify denominator
            iGH                                 // Find GCD
                ?l                              // Check length of filtered H
                    @H                          // Filter H by Y
                        =j25T                   // Assign a set [2,5] to T
                                ?l-HT           // Check length of H - T
                                        1Z2     // Print result

Beachten Sie, dass [2,3] gefiltert nach [2,5] = [2], aber [2,3,5] - [2,5] = [3].


1

PARI / GP, 64 Bytes

f(x,y)=if(setminus(factor(y=y/gcd(x,y))[,1]~,[2,5]),gcd(y,10)>1)

Gibt nichts zum Beenden aus, 0 für rein und 1 für eventuell periodisch.

Nicht sehr ausgefallen, ich hoffte auf etwas Besseres, als ich anfing.


1

05AB1E , 16 11 Bytes

5 Bytes gespart dank @Adnan!

¿²r/fTrÖbÙJ

Gibt 0 für "Nur periodisch", 1 für "Beenden" und 10 für "Eventuell periodisch" aus.

Erläuterung:

                 # Implicit input
                 # Implicit input
  ¿              # Take GCD of numbers
   ²             # Push top value from input register
    r            # Reverse stack order
     /           # Divide (denominator by GCD)
      f          # Find unique prime factors
       TrÖ       # Test 10 for divisibility
          b      # Convert (True -> 1, False -> 0)
           Ù     # Deduplicate array
            J    # Join chars in array
                 # Implicit print

Die Eingabe erfolgt als p newline q .

Probieren Sie es online!


Schön, dass Sie 05AB1E verwenden :). Osabie verwendet auch implizite Eingaben, mit denen wir die ersten beiden entfernen können I. Weiterhin vordefiniert eine Konstante 10ist T. Das Gleiche gilt für 2B, das ist b:).
Adnan

Sie können auch die Eingangsregister verwenden, die uns ¿²r/fTrÖbÙJals endgültigen Code angeben :).
Adnan

1

PHP, 126 Bytes

$d=$argv[2];$a[]=$n=$argv[1];while($n%$d&&!$t){$n*=10;$t=in_array($n%=$d,$a);$a[]=$n;}if($a[1]&&$t)$t+=$a[0]!=end($a);echo+$t;

Gibt 0 für beendet und 1 für rein periodisch 2 für schließlich aus. Lassen Sie mich erklären, ob ein Zähler zweimal im Array ist. Hier beginnt die periodische Sitzung, wenn sie beendet wird. Der echo end($a);Wert lautet 0 Wenn Sie mir nicht vertrauen, geben Sie ihn $t=count($a)>$d?2:0;in die Schleife ein

Zur Verdeutlichung fügen Sie bitte print_r($a);oder var_dump($a);oder json_encode($a);nach der Schleife hinzu

Sie können einen Zähler zweimal oder eine Null am Ende des Arrays sehen, wenn ein Zähler zweimal die Elemente zwischen den beiden Elementen zählt und Sie können die Länge der Periodik abrufen und Sie können die Position des ersten Zählers sehen, an dem die Periodik beginnt

Danach können wir die Position und die Länge der periodischen Folge mit finden if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Visualisieren Sie die Zeitschrift

$d=$argv[2];
$a[]=$n=$argv[1]; #array numerator
$r[]=$n/$d^0; #array result of the division
$r[]=".";
while($n%$d&&!$t){
    $n*=10; 
    $n-=$d*$r[]=$n/$d^0;
    $t=in_array($n%=$d,$a); #stop if numerator is twice 
    $a[]=$n;
}
if($a[1]&&$t)$t+=$a[0]!=end($a); #periodic term starts directly?
if($t){
    echo $p=array_search(end($a),$a)."\n"; #output the beginning position of the periodic term
    echo $l=count($a)-$p-1; #output the length of the periodic term
    echo "\n";
    echo str_repeat(" ",2+$p).str_repeat("_",$l-1)."\n"; #visualize the periodic term
    #echo join(array_slice($r,0,1+$p)).join(array_slice($r,1+$p))."\n";# if you want only the periodic term 
    echo join($r); #result if the division
}
echo+$t; # 0 terminated 1+2 periodic 2 periodic start not directly

Ausgabe visualisieren den periodischen Term

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

Ein anderer Weg mit 130 Bytes

$r=bcdiv(($z=$argv)[1],$z[2],400);for($p=2;$i++<200;)if(substr($r,2,$i)==substr($r,2+$i,$i))$p=1;echo strlen(rtrim($r,0))<50?0:$p;

Erweiterte Version

$r=bcdiv(($z=$argv)[1],$z[2],400); # 100 is the maximal denominator 
# we need a string length with the double value of the sum the length from 1 until the denominator
for($p=2;$i++<200;)if(substr($r,2,$i)==substr($r,2+$i,$i))$p=1;
# all results begin with 0. 
#take two substrings with the same length after that and comparize both. 
#if we found 2 same substrings we have a periodic which starts at the first decimal place
echo strlen(rtrim($r,0))<50?0:$p; 
# if we can trim the length of the result we have a terminated result

Siehe auch Nachkommastellen .
Neil

@Neil du meinst, ich sollte den Code ändern, um die andere Frage zu beantworten?
Jörg Hülsermann

Ich dachte nur, die andere Frage hat keine PHP-Antwort. Vielleicht möchten Sie eine zur Verfügung stellen.
Neil

@RosLuP Für das Beispiel 3/53 wird dieses Array erstellt[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann

3/103 = 0.0291262135922330097087378640776699029126213592233009708 und so kann in der gleichen Periode die gleiche Ziffer erscheinen (zum Beispiel die Ziffer 7 zwischen 00 ... 00 oben) = 10 * (d% b)} wobei die Ziffer d / c ist, als ich denke, dass es in
Ordnung
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.