¿Terminando, puramente periódica o eventualmente periódica?

21

Introducción

Un decimal está terminando si tiene un número finito de dígitos decimales. Por ejemplo, 0.4 (2/5) está terminando porque tiene un dígito decimal.

Un decimal es puramente periódico si tiene un número infinito de dígitos decimales y no tiene dígitos decimales antes de su arrepentimiento (la parte del decimal que se repite). Por ejemplo, 0.142857142857142 ... (1/7) es puramente periódico porque tiene un repetido 142857, que comienza a repetirse inmediatamente después del punto decimal.

Un decimal es eventualmente periódico si tiene un número infinito de dígitos decimales y tiene un número finito de dígitos decimales antes de su arrepentimiento (la parte del decimal que se repite). Por ejemplo, 0.166666666666666 ... (1/6) es eventualmente periódico porque su repetir 6 comienza a repetirse después de un 1.

Tu tarea

Escriba un programa o función que, cuando se le dan los números p y q (enteros, 0 <= p < q <= 100), determinará si la representación decimal de p / q está terminando, es puramente periódica o eventualmente periódica.

Debe de salida asi se trata de terminación (es decir, 0,1), bsi es puramente periódica (es decir, 0,333 ...), o csi es el tiempo periódica (es decir, 0,166 ...), donde a, by cson las cadenas constantes, distintas de su elección.

Casos de prueba

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

Puede encontrar todos los casos de prueba aquí .

Se le permite elegir sus propios 3 valores para la salida, pero debe quedar claro cuál es.

Recuerde, este es el , por lo que gana el código con el menor número de bytes.

Consejos

Terminando:

La factorización prima del denominador de un decimal final en la forma más simple consiste solo en 2s y 5s.

Puramente Periódico:

La factorización prima del denominador de un decimal puramente periódico en la forma más simple no incluye ningún 2s o 5s.

Eventualmente periódico:

La factorización prima de un denominador decimal eventualmente periódico en la forma más simple incluye al menos un 2 o 5, pero también incluye otros números.

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

Oliver Ni
fuente
2
Casi duplicado
Peter Taylor
2
Si pensara que en realidad era un duplicado, habría emitido un voto cerrado. Hay una razón por la que usé la palabra " casi ".
Peter Taylor
1
dada una fracción en la forma p / q Dado cómo? ¿Podemos tomar numerador y denominador como argumentos de función separados?
Dennis
2
¿Podemos generar un valor no constante que cumpla una condición específica, como algo falso para terminar, 1 para puramente periódico y algo mayor que 1 para eventualmente periódico?
ETHproductions
1
No, 1/13 es puramente periódico porque el arrepentimiento es '076923'. El 0 se repite con el arrepentido.
Oliver Ni

Respuestas:

8

Jalea , 10 bytes

:gÆfḍ⁵ṢQ¬Ḅ

Acepta denominador y numerador (en ese orden) como argumentos. Devuelve 0 para terminar, 1 para puramente periódico y 2 para eventualmente periódico. Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

: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
fuente
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

Devuelve 0 para terminar, verdadero para puramente periódico y falso para eventualmente periódico.

Cómo funciona

Lo que estamos haciendo aquí es simular una división a mano:

  1. a?...:0- Si el numerador es cero, nos detenemos aquí y regresamos 0. La secuencia está terminando .
  2. (s[a]^=a)?...:x==a- Si ya hemos encontrado este numerador antes, significa que la secuencia es periódica y se repetirá para siempre. Nos detenemos aquí y devolvemos truesi aes igual al primer valor xde la secuencia ( puramente periódico ) o falsesi no lo es ( eventualmente periódico ).
  3. f(a*10%b,b,s,x||a)- De lo contrario, multiplicamos el numerador apor 10. Calculamos el resto de la división por el denominador b. Y repetimos el proceso usando este resto como el nuevo numerador. (También pasamos acomo primer valor de la secuencia si aún no está almacenada x).

Ejemplo

  • Azul : numerador = 1
  • Verde : denominador = 7
  • Rojo : multiplicaciones por 10
  • Negro : restos
  • Gris : dígitos del cociente (realmente no nos importan aquí, y el código anterior no los calcula en absoluto)

división

Arnauld
fuente
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])

Imprime 1 para eventualmente periódico, 2 para puramente periódico y 4 para terminar.

Verificar todos los casos de prueba en repl.it .

Dennis
fuente
¡Fascinante! ¿Qué *rhacer?
ETHproductions
Desempaqueta la tupla r . f(1, *(2, 3), 4)es equivalente a f(1, 2, 3, 4).
Dennis
Entonces esto sería 56 bytes en JS:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions
Mi mal, 63 bytes (olvidé que intiene un propósito muy diferente en JS que en Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions
@ETHproductions Neat. Supongo f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)que también funcionaría.
Dennis
6

Perl, 49 46 45 bytes

Incluye +3 para -p

Basado en la elegante idea de Dennis , pero implementado de manera perniciosa

Dar números de entrada en STDIN

terminating.pl <<< "2 26"

termninating.pl:

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

Imprime un 2 si termina. 1 si es periódico y nada si eventualmente es periódico

Ton Hospel
fuente
Todos los números en un determinado grupo tienen que dar el mismo valor.
Oliver Ni
@OliverNi Lo hacen ahora
Ton Hospel
3

Lote, 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

Utiliza mi truco rápido gcd10 de Fracción a decimal exacto . Obviamente, podría guardar un montón de bytes utilizando un formato de salida personalizado.

Neil
fuente
¿Por qué no haces solo @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Epara guardar 42 bytes?
ETHproductions
Obviamente, podría guardar un montón de bytes utilizando un formato de salida personalizado.
Oliver Ni
@ETHproductions Creo que no quiere, como Oliver ha señalado con una cita.
Erik the Outgolfer
3

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

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

Salidas NaNpara terminación, 1puramente periódicas y Infinityeventualmente periódicas.

Fragmento de prueba

Explicación

En primer lugar, dividimos ambos n y d por gcd (d, n) , para reducir la fracción a su forma más simple. Esto nos permite evitar situaciones como 2/6 donde el resultado se calcularía como puramente periódico. También definimos la variable t como mcd (d, 10) ; esto se usará más tarde.

La primera comprobación es si n es 0 o d es 1 . Si n * (d-1) es 0, retornamos+f o NaN : la fracción está terminando .

La siguiente comprobación es si t es 1 . Si es así, devolvemos 1 : la fracción es puramente periódica .

Si t no es 1 , dividimos d entre t , ejecutamos toda la función nuevamente y dividimos entre 0. Si n / (d / t) está terminando, esto devuelve NaN / 0 = NaN : la fracción está terminando . De lo contrario, devuelve 1/0 = Infinito : la fracción es eventualmente periódica .

ETHproducciones
fuente
¿Dónde está la reducción a la forma más simple?
Ton Hospel
@TonHospel fijo.
ETHproductions
@Arnauld No estoy seguro de lo que quieres decir. Devuelve Infinitypara todos esos valores.
ETHproductions
@Arnauld Aw, hombre, pensé que podría escaparme sin ajustarme nunca n... Gracias por señalarlo.
ETHproductions
3

Mathematica, 41 bytes

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

Emite {3,1,2}si la entrada tiene una expansión decimal final, {2,3,1}si la entrada tiene una expansión decimal puramente periódica y {3,2,1}si la entrada tiene una expansión decimal periódica eventual.

Basado en el truco disimulado: si des el denominador de una fracción en los términos más bajos, entonces el máximo común divisor de 10^digual dsi dtiene solo 2s y 5s en su factorización prima; es igual 1si dno tiene ni 2 ni 5 en su factorización prima; e iguala algún número entero entre si dtiene 2s / 5s y otros primos.

La Orderingfunción solo informa dónde están los elementos más pequeños, siguientes más pequeños y más grandes del triple, con lazos rotos de izquierda a derecha.

Defecto: devuelve la salida variante en {1,2,3}lugar de {3,1,2}si la entrada es 0.

Mathematica, 46 bytes, perverso

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

Devuelve a[[1]]si la entrada tiene una expansión decimal final, b[[1]]si la entrada tiene una expansión decimal puramente periódica y b[a]si la entrada tiene una expansión decimal eventualmente periódica. Lanza un error en todos los casos!

Como arriba, queremos saber si ese máximo divisor común es igual a 1, d, o en algún punto intermedio. El logaritmo base-d de ese mcd es igual a 0, 1 o algo intermedio.

Ahora comenzamos a torturar a Mathematica. b[a][[n]]denota la nparte th de la expresión b[a]. Entonces b[a][[1]]vuelve a; b[a][[0]]retornos b; y b[a][[x]], donde xhay un número entre 0 y 1, hace que Mathematica arroje el error "Parte :: pkspec1: La expresión xno puede usarse como una especificación de parte". y vuelve sin b[a][[x]]evaluar.

Esto ya distingue los tres casos de manera apropiada, excepto que la salida para el caso eventualmente periódico b[a][[x]]es no constante porque xes el logaritmo real de algo. Entonces aplicamos [[1]]a las salidas ya descritas. Debido a cómo Mathematica representa internamente b[a][[x]], el resultado de b[a][[x]][[1]]es simplemente b[a]. Por otro lado, aplicar [[1]]a los aresultados un error diferente "Parte :: partd: Especificación de parte a [[1]] es más larga que la profundidad del objeto". y devuelve sin a[[1]]evaluar (y de manera similar para b).

Defecto: mentiras sobre la entrada 0, que regresan b[a]en lugar de a[[1]].

Greg Martin
fuente
2

C 173 Bytes

Toma dos enteros de stdin, imprime 1 para puramente periódico, -1 para eventualmente periódico y 0 para terminar.

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

Sin golf:

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

Medio golf:

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
fuente
2

En realidad , 15 bytes

Esto se basa en la respuesta de Dennis 'Jelly . 0 está terminando, 1 es puramente periódico y 2 eventualmente es periódico. Sugerencias de golf bienvenidas. Pruébalo en línea!

▼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
fuente
1

Mathematica, 44 bytes

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

Devoluciones Nullpor terminación, Truepor puramente periódicas, yFalse eventualmente periódicas.

Explicación

RealDigits

Encuentre la expansión decimal de N. (los dígitos repetidos están rodeados por una cabeza adicional List {}).

ListQ@Last@#

Compruebe si el último elemento de la expansión decimal es a List.

Length@#==1

Si la condición anterior es True, verifique si toda la expansión decimal consiste en una cosa. (A Listcuenta como una entidad). (vuelve Trueo False)

(Si la condición es False, entonces Nullse devuelve a porque no hay un tercer argumento para If)

JungHwan Min
fuente
1

Pyth , 31 27 bytes

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

Entrada

4,12

Puedes probarlo aquí . Imprime 1 para eventualmente periódico, 2 para puramente periódico y 0 para terminar. Esta es la primera vez que respondo en codegolf. Cualquier sugerencia es bienvenida.

Explicación

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

Tenga en cuenta que [2,3] filtrado por [2,5] = [2] pero [2,3,5] - [2,5] = [3].

Joshua
fuente
1

PARI / GP, 64 bytes

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

No genera nada para terminar, 0 para puramente y 1 para eventualmente periódico.

No muy elegante, esperaba algo mejor cuando comencé.

Christian Sievers
fuente
1

05AB1E , 16 11 bytes

¡Guardado 5 bytes gracias a @Adnan!

¿²r/fTrÖbÙJ

Imprime 0 para puramente periódico, 1 para terminar y 10 para eventualmente periódico.

Explicación:

                 # 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

La entrada se toma como p nueva línea q .

Pruébalo en línea!

Oliver Ni
fuente
Me alegro de verte usando 05AB1E :). Osabie también usa entradas implícitas que nos permiten eliminar las dos primeras I. Además, una constante predefinida para 10es T. Lo mismo para 2B, que es b:).
Adnan
También puede usar los registros de entrada, que nos da ¿²r/fTrÖbÙJcomo el código final :).
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;

Imprime 0 para terminado y 1 para puramente periódico 2 para eventualmente. Permítanme explicar si un numerador está dos veces en la matriz, aquí comienza la sesión periódica si se termina, el echo end($a);valor es 0 Si no confía en mí, ponga $t=count($a)>$d?2:0;en el bucle

Para que quede más claro por favor agregue print_r($a);o var_dump($a);o json_encode($a);después del bucle

puede ver un numerador dos veces o un cero al final de la matriz si un numerador cuenta dos veces los elementos entre los dos elementos y puede obtener la longitud del periódico y puede ver la posición del primer numerador donde comienza el periódico

Entonces, después de eso, podemos encontrar la posición y la longitud de la secuencia periódica con if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Visualiza el periódico

$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

La salida visualiza el término periódico

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

Otra forma con 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;

Versión ampliada

$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
fuente
Ver también Fracción a decimal exacto .
Neil
@Neil, ¿quieres decir que debería modificar el código para responder la otra pregunta?
Jörg Hülsermann
Bueno, estaba pensando que la otra pregunta no tiene una respuesta PHP; tal vez le gustaría proporcionar uno.
Neil
@RosLuP Para el ejemplo 3/53 se creará esta matriz[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann el
3/103 = 0.0291262135922330097087378640776699029126213592233009708 y así en el mismo período puede aparecer el mismo dígito (por ejemplo, el dígito 7 entre 00 ... 00 arriba) Pero si la matriz de la que habla no es la de dígitos sino la matriz de {d = 10 * (d% b)} donde el dígito es d / c de lo que creo que está bien, solo hay un valor d_i para cada período ...
RosLuP