Kończący, czysto okresowy czy w końcu okresowy?

21

Wprowadzenie

Dziesiętny kończy się, jeśli ma skończoną liczbę cyfr dziesiętnych. Na przykład 0,4 (2/5) kończy się, ponieważ ma jedną cyfrę dziesiętną.

Liczba dziesiętna jest czysto okresowa, jeśli ma nieskończoną liczbę cyfr dziesiętnych i nie ma cyfr dziesiętnych przed powtórzeniem (część dziesiętna, która się powtarza). Na przykład 0,142857142857142… (1/7) jest czysto okresowa, ponieważ ma powtarzalność 142857, który zaczyna się powtarzać natychmiast po przecinku.

Dziesiętny jest ostatecznie okresowy, jeśli ma nieskończoną liczbę cyfr dziesiętnych i ma skończoną liczbę cyfr dziesiętnych przed powtórzeniem (część dziesiętna, która się powtarza). Na przykład 0.166666666666666… (1/6) jest ostatecznie okresowy, ponieważ jego powtórzenie 6 zaczyna się powtarzać po 1.

Twoje zadanie

Napisz program lub funkcję, która, gdy otrzyma liczby p i q (liczby całkowite, 0 <= p < q <= 100), określi, czy dziesiętna reprezentacja p / q jest zakończona, czysto okresowa czy ewentualnie okresowa.

Musisz wyjście aczy to kończące (czyli 0,1), bjeśli jest to czysto Okresowe (czyli 0,333 ...), lub cjeśli jest to Ostatecznie Okresowe (czyli 0,166 ...), gdzie a, bi csą jakieś wyraźne, stałe ciągi wyboru.

Przypadki testowe

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

Można znaleźć wszystkie przypadki testowe tutaj .

Możesz wybrać własne 3 wartości wyjściowe, ale musi być jasne, która z nich jest.

Pamiętaj, że to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Poradnik

Zakończenie:

Faktoryzacja pierwotna mianownika kończącego dziesiętnego w najprostszej postaci składa się tylko z 2 i 5 s.

Czysto okresowe:

Faktoryzacja pierwotna mianownika czysto okresowego dziesiętnego w najprostszej postaci nie obejmuje żadnych 2s lub 5s.

Ostatecznie okresowe:

Faktoryzacja pierwotna mianownika ostatecznie okresowego dziesiętnego w najprostszej postaci obejmuje co najmniej jedną 2 lub 5, ale obejmuje także inne liczby.

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Oliver Ni
źródło
2
Prawie duplikat
Peter Taylor
2
Gdybym myślał, że to w rzeczywistości duplikat, oddałbym głosowanie. Jest powód, dla którego użyłem słowa „ prawie ”.
Peter Taylor,
1
biorąc pod uwagę ułamek w postaci p / q Biorąc pod uwagę jak? Czy możemy traktować licznik i mianownik jako osobne argumenty funkcji?
Dennis,
2
Czy możemy wygenerować niestałą wartość spełniającą określony warunek, taki jak cokolwiek fałszywego dla zakończenia, 1 dla czysto okresowego i cokolwiek większego niż 1 dla ostatecznie okresowego?
ETHprodukcje 11.10.16
1
Nie, 1/13 jest czysto okresowe, ponieważ powtarzające się to „076923”. 0 powtarza się z powtarzającymi się.
Oliver Ni

Odpowiedzi:

8

Galaretka , 10 bajtów

:gÆfḍ⁵ṢQ¬Ḅ

Akceptuje mianownik i licznik (w tej kolejności) jako argumenty. Zwraca 0 za zakończenie, 1 za czysto okresowe i 2 za ewentualnie okresowe. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

: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.
Dennis
źródło
11

JavaScript (ES6), 70 .. 68 53 bajtów

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

Zwraca 0 za zakończenie, true dla czysto okresowego i false dla ostatecznie okresowego.

Jak to działa

To, co tutaj robimy, polega na ręcznej symulacji podziału:

  1. a?...:0- Jeśli licznik wynosi zero, zatrzymujemy się tutaj i wracamy 0. Sekwencja się kończy .
  2. (s[a]^=a)?...:x==a- Jeśli już wcześniej spotkałem się z tym licznikiem, oznacza to, że sekwencja jest okresowa i będzie się powtarzać na zawsze. Zatrzymujemy się tutaj i zwracamy albo, truejeśli ajest równa pierwszej wartości xsekwencji ( czysto okresowa ), albo falsejeśli nie jest ( ewentualnie okresowa ).
  3. f(a*10%b,b,s,x||a)- W przeciwnym razie mnożymy licznik aprzez 10. Obliczamy pozostałą część podziału przez mianownik b. Powtarzamy ten proces, używając tej reszty jako nowego licznika. (Podajemy również ajako pierwszą wartość sekwencji, jeśli nie jest jeszcze zapisana x.)

Przykład

  • Niebieski : licznik = 1
  • Zielony : mianownik = 7
  • Czerwony : pomnożenie przez 10
  • Czarny : resztki
  • Szary : cyfry ilorazowe (tutaj tak naprawdę nie dbamy o nie, a powyższy kod w ogóle ich nie oblicza)

podział

Arnauld
źródło
9

Python, 62 61 59 bajtów

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

Drukuje 1 dla ewentualnie okresowego, 2 dla czysto okresowego i 4 dla zakończenia.

Weryfikacji wszystkich przypadków testowych na repl.it .

Dennis
źródło
Fascynujący! Co ma *rzrobić?
ETHproductions
Rozpakowuje krotkę r . f(1, *(2, 3), 4)jest równoważne z f(1, 2, 3, 4).
Dennis
W JS byłoby to 56 bajtów:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHprodukcje
Moje złe, 63 bajty (zapomniałem, że insłuży w JS zupełnie innym celom niż w Pythonie):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHprodukcje
@ETHproductions Neat. Myślę, f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)że też zadziałałoby.
Dennis,
6

Perl, 49 46 45 bajtów

Obejmuje +3 za -p

Oparty na eleganckim pomyśle Dennisa , ale zrealizowany perfekcyjnie

Podaj liczby wejściowe na STDIN

terminating.pl <<< "2 26"

termninating.pl:

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

Drukuje 2, jeśli kończy się. 1, jeśli jest okresowy i nic, jeśli ostatecznie

Ton Hospel
źródło
Wszystkie liczby w pewnej grupie muszą mieć tę samą wartość.
Oliver Ni
@OliverNi Robią teraz
Ton Hospel
3

Partia, 247 bajtów

@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

Używa mojej szybkiej sztuczki gcd10 od frakcji do dokładnej liczby dziesiętnej . Oczywiście mogłem zapisać sporo bajtów, używając niestandardowego formatu wyjściowego.

Neil
źródło
Dlaczego po prostu nie @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Echcesz zaoszczędzić 42 bajtów?
ETHproductions
Oczywiście mogłem zapisać sporo bajtów, używając niestandardowego formatu wyjściowego.
Oliver Ni
@ETHproductions Myślę, że nie chce, jak zauważył cytat Oliver.
Erik the Outgolfer,
3

JavaScript (ES6), 91 88 85 79 75 74 78 bajtów

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

Dane wyjściowe NaNdo zakończenia, 1wyłącznie okresowe i Infinityewentualnie okresowe.

Testowy fragment kodu

Wyjaśnienie

Po pierwsze, dzielą zarówno n i d o GCD (d, n) , aby zmniejszyć frakcję najprostszej formie. Pozwala nam to uniknąć sytuacji takich jak 2/6, w których wynik byłby w przeciwnym razie obliczany jako czysto okresowy. Definiujemy również zmienną t jako gcd (d, 10) ; zostanie to wykorzystane później.

Pierwsza kontrola dotyczy tego, czy n wynosi 0, czy d wynosi 1 . Jeśli n * (d-1) wynosi 0, zwracamy +flub NaN : ułamek się kończy .

Następnym sprawdzeniem jest, czy t wynosi 1 . Jeśli tak, zwracamy 1 : ułamek jest czysto okresowy .

Jeśli t nie jest równe 1 , dzielimy d przez t , uruchamiamy ponownie całą funkcję i dzielimy przez 0. Jeśli n / (d / t) się kończy, to zwraca NaN / 0 = NaN : ułamek się kończy . W przeciwnym razie zwraca 1/0 = Nieskończoność : ułamek jest ostatecznie okresowy .

ETHprodukcje
źródło
Gdzie jest redukcja do najprostszej formy?
Ton Hospel,
@TonHospel Naprawiono.
ETHproductions
@Arnauld Nie jestem pewien, co masz na myśli. Zwraca Infinitywszystkie te wartości.
ETHproductions
@Arnauld Aw, człowieku, myślałem, że uda mi się uciec od tego, że nigdy się nie dostosowuję n... Dzięki za zwrócenie na to uwagi.
ETHproductions
3

Mathematica, 41 bajtów

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

Wyprowadzane, {3,1,2}jeśli dane wejściowe mają końcowe rozszerzenie dziesiętne, {2,3,1}jeśli dane wejściowe mają wyłącznie okresowe rozwinięcie dziesiętne i {3,2,1}jeśli dane wejściowe mają ewentualnie okresowe rozszerzenie dziesiętne.

Oparty na podstępnej sztuczce: jeśli dmianownik ułamka jest w najniższych kategoriach, to największy wspólny dzielnik di 10^drówna się, djeśli dma tylko 2 i 5 w swojej podstawowej faktoryzacji; jest równy, 1jeśli dnie ma ani 2, ani 5 w swojej podstawowej faktoryzacji; i równa się pewnej liczbie całkowitej, jeśli dma 2s / 5s i inne liczby pierwsze.

OrderingFunkcja po prostu informuje, gdzie najmniejsze, następna najmniejsza, a największe elementy są potrójne, z więzi broken lewej do prawej.

Wada: zwraca wariant wyniku {1,2,3}zamiast, {3,1,2}jeśli wejście ma wartość 0.

Mathematica, 46 bajtów, perwersja

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

Zwraca, a[[1]]jeśli dane wejściowe mają końcowe rozszerzenie dziesiętne, b[[1]]jeśli dane wejściowe mają czysto okresowe rozszerzenie dziesiętne i b[a]jeśli dane wejściowe mają ewentualnie okresowe rozszerzenie dziesiętne. Zgłasza błąd we wszystkich przypadkach!

Jak wyżej, chcemy wiedzieć, czy ten największy wspólny dzielnik wynosi 1, d, czy gdzieś pomiędzy. Logarytm base-d tego gcd wynosi 0, 1 lub coś pomiędzy.

Teraz zaczynamy torturować Mathematicę. b[a][[n]]oznacza nth część wyrażenia b[a]. Więc b[a][[1]]wraca a; b[a][[0]]zwraca b; a b[a][[x]]gdzie xjest liczbą od 0 do 1, Mathematica zgłasza błąd „Part :: pkspec1: Wyrażenie xnie może być użyte jako specyfikacja części”. i zwraca b[a][[x]]nieocenione.

To już odpowiednio rozróżnia trzy przypadki, z wyjątkiem tego, że wynik dla przypadku ostatecznie okresowego jest taki b[a][[x]], co nie jest stałe, ponieważ xjest faktycznym logarytmem czegoś. Zatem stosujemy się [[1]]do już opisanych wyników. Ze względu na to, jak Mathematica wewnętrznie reprezentuje b[a][[x]], wynik b[a][[x]][[1]]jest po prostu b[a]. Z drugiej strony zastosowanie [[1]]do awyników powoduje inny błąd „Part :: partd: Specyfikacja części a [[1]] jest większa niż głębokość obiektu.” i zwraca a[[1]]nieocenione (i podobnie dla b).

Wada: kłamie na temat wejścia 0, zwracając b[a]zamiast a[[1]].

Greg Martin
źródło
2

C 173 bajtów

Pobiera dwie liczby całkowite ze standardowego, drukuje 1 dla czysto okresowego, -1 dla ewentualnie okresowego i 0 dla zakończenia.

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);}

Nie golfowany:

// 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;
}   

Pół golfa:

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);
}
LambdaBeta
źródło
2

Właściwie 15 bajtów

Jest to oparte na odpowiedzi Jelnisa ​​na żelki . 0 kończy się, 1 jest czysto okresowe, a 2 ostatecznie jest okresowe. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj 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.
Sherlock9
źródło
1

Mathematica, 44 bajty

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

Zwroty Nullza zakończenie,True za okresowo i Falseewentualnie okresowo.

Wyjaśnienie

RealDigits

Znajdź rozwinięcie dziesiętne N. (powtarzające się cyfry są otoczone dodatkową głową List {}).

ListQ@Last@#

Sprawdź, czy ostatnim elementem rozwinięcia dziesiętnego jest a List.

Length@#==1

Jeśli powyższy warunek jest spełniony True, sprawdź, czy całe rozwinięcie dziesiętne składa się z jednej rzeczy. (ZAList liczy się jako jeden byt). (zwraca Truelub False)

(Jeśli warunek jest spełniony False, Nullto zwracane jest a, ponieważ nie ma trzeciego argumentu za If)

JungHwan Min
źródło
1

Pyth , 31 27 bajtów

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

Wkład

4,12

Możesz spróbować tutaj . Drukuje 1 dla ewentualnie okresowego, 2 dla czysto okresowego i 0 dla zakończenia. To jest moja pierwsza odpowiedź w codegolf. Wszelkie sugestie są mile widziane.

Wyjaśnienie

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

Należy zauważyć, że [2,3] filtrowane według [2,5] = [2], ale [2,3,5] - [2,5] = [3].

Jozuego
źródło
1

PARI / GP, 64 bajty

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

Nie wyprowadza nic do zakończenia, 0 dla czysto i 1 dla ewentualnie okresowego.

Niezbyt fantazyjne, kiedy zaczynałem, liczyłem na coś lepszego.

Christian Sievers
źródło
1

05AB1E , 16 11 bajtów

Zaoszczędź 5 bajtów dzięki @Adnan!

¿²r/fTrÖbÙJ

Drukuje 0 dla czysto okresowego, 1 dla kończącego i 10 dla ostatecznie okresowego.

Wyjaśnienie:

                 # 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

Wejście przyjmuje się jako p nowy wiersz q .

Wypróbuj online!

Oliver Ni
źródło
Miło cię widzieć za pomocą 05AB1E :). Osabie wykorzystuje także dane niejawne, które pozwalają nam usunąć pierwsze dwa I. Ponadto stałą predefiniowaną na 10jest T. To samo dotyczy 2B, co jest b:).
Adnan
Możesz także użyć rejestrów wejściowych, co daje nam ¿²r/fTrÖbÙJjako kod końcowy :).
Adnan
1

PHP, 126 bajtów

$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;

Drukuje 0 dla zakończonego i 1 dla czysto okresowego 2 dla ostatecznie. Pozwól mi wyjaśnić, czy licznik jest dwa razy w tablicy tutaj rozpoczyna sesję okresową, jeśli zostanie zakończona, echo end($a);wartość wynosi 0 Jeśli nie ufasz mi umieścić$t=count($a)>$d?2:0; w pętli

Aby było to bardziej jasne, dodaj print_r($a);lub var_dump($a);lubjson_encode($a); po pętli

możesz zobaczyć jeden licznik dwa razy lub zero na końcu tablicy, jeśli licznik jest dwa razy policz elementy między tymi dwoma elementami i możesz uzyskać długość okresu i możesz zobaczyć pozycję według pierwszego licznika, od którego zaczyna się okres

Po tym możemy znaleźć pozycję i długość sekwencji okresowej za pomocą if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Wizualizuj czasopismo

$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

Dane wyjściowe wizualizują okres

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

Innym sposobem jest 130 bajtów

$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;

Wersja rozszerzona

$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
Jörg Hülsermann
źródło
@Neil masz na myśli, że powinienem zmodyfikować kod, aby odpowiedzieć na inne pytanie?
Jörg Hülsermann
Cóż, myślałem, że na inne pytanie nie ma odpowiedzi w PHP; być może chciałbyś je podać.
Neil,
@RosLuP Na przykład 3/53 ta tablica zostanie utworzona[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann
3/103 = 0,0291262135922330097087378640776699029126213592233009708 i dlatego w tym samym okresie może pojawić się ta sama cyfra (na przykład cyfra 7 między 00 ... 00 powyżej) Ale jeśli tablica, o której mówisz, nie jest cyfrą, ale tablicą {d = 10 * (d% b)} gdzie cyfra to d / c niż myślę, że jest w porządku, dla każdego okresu jest tylko jedna wartość d_i ...
RosLuP,