Fin, purement périodique ou éventuellement périodique?

21

introduction

Une décimale se termine si elle a un nombre fini de chiffres décimaux. Par exemple, 0.4 (2/5) se termine car il a un chiffre décimal.

Une décimale est purement périodique si elle a un nombre infini de chiffres décimaux et n'a pas de chiffres décimaux avant sa répétition (la partie de la décimale qui se répète.) Par exemple, 0,142857142857142… (1/7) est purement périodique car elle a une répétition 142857, qui commence à se répéter immédiatement après la virgule décimale.

Une décimale est finalement périodique si elle a un nombre infini de chiffres décimaux et a un nombre fini de chiffres décimaux avant sa répétition (la partie de la décimale qui se répète.) Par exemple, 0.16666666666666666… (1/6) est finalement périodique parce que son repetend 6 commence à se répéter après un 1.

Ta tâche

Écrivez un programme ou une fonction qui, lorsque les nombres p et q (nombres entiers, 0 <= p < q <= 100), détermineront si la représentation décimale de p / q se termine, purement périodique ou éventuellement périodique.

Vous devez sortie asi elle est Terminating (soit 0,1), bsi elle est Purement périodique (c. -à 0,333 ...), ou csi elle est finalement périodique (c. -à 0,166 ...), où a, bet csont des chaînes distinctes, constantes de votre choix.

Cas de test

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

Vous pouvez trouver tous les cas de test ici .

Vous êtes autorisé à choisir vos propres 3 valeurs pour la sortie, mais il doit être clair quant à laquelle il s'agit.

N'oubliez pas qu'il s'agit de , donc le code avec le plus petit nombre d'octets l'emporte.

Astuces

Résiliation:

La factorisation principale du dénominateur d'une décimale terminale sous sa forme la plus simple se compose uniquement de 2 et de 5.

Purement périodique:

La factorisation première d'un dénominateur décimal purement périodique sous sa forme la plus simple n'inclut aucun 2 ou 5.

Eventuellement périodique:

La factorisation principale d'un dénominateur décimal éventuellement périodique sous sa forme la plus simple comprend au moins un 2 ou 5, mais comprend également d'autres nombres.

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

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

Oliver Ni
la source
2
Presque en double
Peter Taylor
2
Si je pensais qu'il s'agissait en fait d' un doublon, j'aurais voté de près. Il y a une raison pour laquelle j'ai utilisé le mot " presque ".
Peter Taylor
1
étant donné une fraction sous la forme p / q Étant donné comment? Pouvons-nous prendre le numérateur et le dénominateur comme des arguments de fonction séparés?
Dennis
2
Pouvons-nous produire une valeur non constante remplissant une condition spécifique, telle que quelque chose de faux pour terminer, 1 pour purement périodique et quelque chose de supérieur à 1 pour éventuellement périodique?
ETHproductions
1
Non, 1/13 est purement périodique car le répétiteur est '076923'. Le 0 se répète avec le repetent.
Oliver Ni

Réponses:

8

Gelée , 10 octets

:gÆfḍ⁵ṢQ¬Ḅ

Accepte le dénominateur et le numérateur (dans cet ordre) comme arguments. Renvoie 0 pour terminer, 1 pour purement périodique et 2 pour éventuellement périodique. Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

: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
la source
11

JavaScript (ES6), 70 .. 68 53 octets

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

Renvoie 0 pour terminer, vrai pour purement périodique et faux pour éventuellement périodique.

Comment ça marche

Ce que nous faisons ici est en fait de simuler une division à la main:

  1. a?...:0- Si le numérateur est nul, nous nous arrêtons ici et revenons 0. La séquence se termine .
  2. (s[a]^=a)?...:x==a- Si nous avons déjà rencontré ce numérateur auparavant, cela signifie que la séquence est périodique et va se répéter pour toujours. Nous nous arrêtons ici et retournons soit truesi aest égal à la première valeur xde la séquence ( purement périodique ) ou falsesi ce n'est pas ( éventuellement périodique ).
  3. f(a*10%b,b,s,x||a)- Sinon, on multiplie le numérateur apar 10. On calcule le reste de la division par le dénominateur b. Et nous répétons le processus en utilisant ce reste comme nouveau numérateur. (Nous transmettons également ala première valeur de la séquence si elle n'est pas déjà stockée dans x.)

Exemple

  • Bleu : numérateur = 1
  • Vert : dénominateur = 7
  • Rouge : multiplications par 10
  • Noir : restes
  • Gris : chiffres du quotient (nous ne nous soucions pas vraiment d'eux ici, et le code ci-dessus ne les calcule pas du tout)

division

Arnauld
la source
9

Python, 62 61 59 octets

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

Imprime 1 pour éventuellement périodique, 2 pour purement périodique et 4 pour terminer.

Vérifiez tous les tests sur repl.it .

Dennis
la source
Fascinant! Que fait *r-il?
ETHproductions
Il déballe le tuple r . f(1, *(2, 3), 4)est équivalent à f(1, 2, 3, 4).
Dennis
Ce serait donc 56 octets en JS:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions
Mon mauvais, 63 octets (j'ai oublié que cela insert un but très différent en JS qu'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. Je suppose que f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)cela fonctionnerait aussi.
Dennis
6

Perl, 49 46 45 octets

Comprend +3 pour -p

Basé sur l' idée élégante de Dennis mais mis en œuvre de manière périlleuse

Donner des numéros d'entrée sur STDIN

terminating.pl <<< "2 26"

termninating.pl:

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

Imprime un 2 s'il se termine. 1 si périodique et rien si éventuellement périodique

Ton Hospel
la source
Tous les nombres d'un certain groupe doivent donner la même valeur.
Oliver Ni
@OliverNi Ils le font maintenant
Ton Hospel
3

Lot, 247 octets

@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

Utilise mon astuce rapide gcd10 de Fraction à la décimale exacte . Évidemment, je pouvais enregistrer un tas d'octets en utilisant un format de sortie personnalisé.

Neil
la source
Pourquoi ne faites-vous pas simplement @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Epour économiser 42 octets?
ETHproductions
Évidemment, je pouvais enregistrer un tas d'octets en utilisant un format de sortie personnalisé.
Oliver Ni
@ETHproductions Je pense qu'il ne veut pas, comme l'a noté Oliver avec une citation.
Erik the Outgolfer du
3

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

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

Sorties NaNde terminaison, 1purement périodiques et Infinityéventuellement périodiques.

Extrait de test

Explication

Premièrement, nous divisons à la fois n et d par pgcd (d, n) , pour réduire la fraction à sa forme la plus simple. Cela nous permet d'éviter des situations comme 2/6 où le résultat serait autrement calculé comme purement périodique. Nous définissons également la variable t comme pgcd (d, 10) ; cela sera utilisé plus tard.

La première vérification est de savoir si n est 0 ou d est 1 . Si n * (d-1) vaut 0, on retourne +f, ou NaN : la fraction se termine .

La prochaine vérification est de savoir si t est 1 . Si c'est le cas, nous retournons 1 : la fraction est purement périodique .

Si t n'est pas 1 , nous divisons d par t , exécutons à nouveau la fonction entière et divisons par 0. Si n / (d / t) se termine, cela renvoie NaN / 0 = NaN : la fraction se termine . Sinon, elle renvoie 1/0 = Infinity : la fraction est finalement périodique .

ETHproductions
la source
Où est la réduction à la forme la plus simple?
Ton Hospel
@TonHospel Fixed.
ETHproductions
@Arnauld, je ne sais pas ce que tu veux dire. Il renvoie Infinitypour toutes ces valeurs.
ETHproductions
@Arnauld Aw, mec, je pensais que je pourrais m'en tirer sans jamais m'adapter n... Merci de l'avoir signalé.
ETHproductions
3

Mathematica, 41 octets

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

Sort {3,1,2}si l'entrée a une expansion décimale terminale, {2,3,1}si l'entrée a une expansion décimale purement périodique et {3,2,1}si l'entrée a une expansion décimale éventuellement périodique.

Basé sur l'astuce sournoise: si dest le dénominateur d'une fraction en termes les plus bas, alors le plus grand diviseur commun de det 10^dest égal à dsi dn'a que 2s et 5s dans sa factorisation principale; est égal à 1si dn'a ni 2 ni 5 dans sa factorisation principale; et est égal à un entier entre if da 2s / 5s et d'autres nombres premiers.

La Orderingfonction indique simplement où se trouvent les éléments les plus petits, les plus petits et les plus grands du triple, avec des liens rompus de gauche à droite.

Flaw: renvoie la sortie de la variante {1,2,3}au lieu de {3,1,2}si l'entrée est 0.

Mathematica, 46 octets, pervers

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

Renvoie a[[1]]si l'entrée a une expansion décimale terminale, b[[1]]si l'entrée a une expansion décimale purement périodique et b[a]si l'entrée a une expansion décimale éventuellement périodique. Lance une erreur dans tous les cas!

Comme ci-dessus, nous voulons savoir si ce plus grand diviseur commun est égal à 1, d ou quelque part entre les deux. Le logarithme en base d de ce pgcd est égal à 0, 1, ou quelque chose entre les deux.

Maintenant, nous commençons à torturer Mathematica. b[a][[n]]désigne la npartie e de l'expression b[a]. b[a][[1]]Retourne donc a; b[a][[0]]retourne b; et b[a][[x]], où xest un nombre compris entre 0 et 1, oblige Mathematica à renvoyer l'erreur "Part :: pkspec1: l'expression xne peut pas être utilisée comme spécification de pièce." et retourne non b[a][[x]]évalué.

Cela distingue déjà les trois cas de manière appropriée, sauf que la sortie du cas éventuellement périodique est b[a][[x]], ce qui n'est pas constant car xc'est le logarithme réel de quelque chose. Nous appliquons [[1]]donc les sorties déjà décrites. En raison de la façon dont Mathematica représente en interne b[a][[x]], le résultat b[a][[x]][[1]]est simplement b[a]. D'un autre côté, l'application [[1]]aux arésultats génère une erreur différente "Part :: partd: la spécification de pièce a [[1]] est plus longue que la profondeur de l'objet." et retourne non a[[1]]évalué (et de même pour b).

Défaut: ment à propos de l'entrée 0, renvoyant à la b[a]place de a[[1]].

Greg Martin
la source
2

C 173 octets

Prend deux entiers de stdin, affiche 1 pour purement périodique, -1 pour éventuellement périodique et 0 pour terminer.

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

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

Semi-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
la source
2

En fait , 15 octets

Ceci est basé sur la réponse Jelly de Dennis . 0 se termine, 1 est purement périodique et 2 est finalement périodique. Suggestions de golf bienvenues. Essayez-le en ligne!

▼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
la source
1

Mathematica, 44 octets

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

Renvoie Nullpour Terminer, Truepour purement périodique et Falsepour éventuellement périodique.

Explication

RealDigits

Trouvez l'expansion décimale de N. (les chiffres répétés sont entourés d'une tête supplémentaire List {}).

ListQ@Last@#

Vérifiez si le dernier élément de l'expansion décimale est a List.

Length@#==1

Si la condition ci-dessus est True, vérifiez si l'expansion décimale entière consiste en une chose. (A Listcompte comme une entité). (retourne Trueou False)

(Si la condition est False, alors a Nullest retourné car il n'y a pas de troisième argument pour If)

JungHwan Min
la source
1

Pyth , 31 27 octets

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

Contribution

4,12

Vous pouvez l'essayer ici . Imprime 1 pour éventuellement périodique, 2 pour purement périodique et 0 pour terminer. C'est ma première réponse en codegolf. Toutes suggestions sont les bienvenues.

Explication

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

Notez que [2,3] filtré par [2,5] = [2] mais [2,3,5] - [2,5] = [3].

Joshua
la source
1

PARI / GP, 64 octets

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

N'affiche rien pour terminer, 0 pour purement et 1 pour éventuellement périodique.

Pas très chic, j'espérais quelque chose de mieux quand j'ai commencé.

Christian Sievers
la source
1

05AB1E , 16 11 octets

5 octets enregistrés grâce à @Adnan!

¿²r/fTrÖbÙJ

Imprime 0 pour purement périodique, 1 pour terminer et 10 pour éventuellement périodique.

Explication:

                 # 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

L'entrée est considérée comme p newline q .

Essayez-le en ligne!

Oliver Ni
la source
Ravi de vous voir utiliser 05AB1E :). Osabie utilise également une entrée implicite qui nous permet de supprimer les deux premiers I. De plus, une constante prédéfinie à 10est T. Pareil pour 2B, qui est b:).
Adnan
Vous pouvez également utiliser les registres d'entrée, ce qui nous donne ¿²r/fTrÖbÙJcomme code final :).
Adnan
1

PHP, 126 octets

$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 pour terminé et 1 pour purement périodique 2 pour éventuellement. Permettez-moi de vous expliquer si un numérateur est deux fois dans le tableau commence ici la session périodique si elle est terminée, la echo end($a);valeur est 0 Si vous ne me faites pas confiance, mettez $t=count($a)>$d?2:0;dans la boucle

Pour le rendre plus clair, veuillez ajouter print_r($a);ou var_dump($a);ou json_encode($a);après la boucle

vous pouvez voir un numérateur deux fois ou un zéro à la fin du tableau si un numérateur est deux fois compter les éléments entre les deux éléments et vous pouvez obtenir la longueur du périodique et vous pouvez voir la position par le premier numérateur où le périodique commence

Donc, après cela, nous pouvons trouver la position et la longueur de la séquence périodique avec if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Visualisez le périodique

$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

Sortie visualiser le terme périodique

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

Une autre façon avec 130 octets

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

Version étendue

$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
la source
@Neil tu veux dire que je devrais modifier le code pour répondre à l'autre question?
Jörg Hülsermann du
Eh bien, je pensais juste que l'autre question n'a pas de réponse PHP; vous aimeriez peut-être en fournir un.
Neil
@RosLuP Pour l'exemple 3/53, ce tableau sera créé[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann
3/103 = 0,0291262135922330097087378640776699029126213592233009708 et ainsi dans la même période peut apparaître le même chiffre (par exemple le chiffre 7 entre 00 ... 00 ci-dessus) Mais si le tableau dont vous parlez n'est pas celui du chiffre mais le tableau du {d = 10 * (d% b)} où le chiffre est d / c que je pense que c'est ok il n'y a qu'une seule valeur d_i à chaque période ...
RosLuP