Sonlandırma, Tamamen Periyodik veya Sonunda Periyodik?


21

Giriş

Bir ondalık, sınırlı sayıda ondalık basamağa sahipse sonlanır. Örneğin, 0.4 (2/5) bir ondalık basamağa sahip olduğu için sonlanıyor.

Ondalık ondalık basamak sayısına sahipse ve tekrar etmeden önce ondalık basamağa sahip değilse (ondalık basamağın tekrarı olan kısmı), bir ondalık basamağı sadece periyodiktir. Örneğin, 0.142857142857142… (1/7) tamamen tekrarlanmıştır. 142857, ondalık noktasından hemen sonra tekrar etmeye başlar.

Bir ondalık, sonsuz sayıda ondalık basamağa sahipse ve tekrar etmeden önce sonlu bir ondalık basamağa sahipse (tekrarlayan ondalık basamağın bir parçası), periyodiktir. Örneğin, 0.166666666666666… (1/6) sonunda periyodiktir, çünkü tekrar 6, 1 den sonra tekrar etmeye başlar.

Senin görevin

P ve q sayıları verildiğinde (tamsayılar, 0 <= p < q <= 100), p / q'nun ondalık gösteriminin bitip bitmediğini, tamamen periyodik veya sonunda periyodik olup olmadığını belirleyecek bir program veya işlev yazın .

Sen gerekir çıktı a's sonlandırma (yani 0.1), bbu Tamamen Periyodik ise (yani 0.333 ...) ya cda Sonunda Periyodik ise (yani 0.166 ...), nerede a, bve cseçtiğiniz herhangi belirgin, sabit dizelerdir.

Test durumları

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

Tüm test durumlarını burada bulabilirsiniz .

Çıktı için kendi 3 değerinizi seçmenize izin verilir, ancak hangisi olduğu açık olmalıdır.

Unutmayın, bu , bu yüzden en az bayt sayısına sahip olan kod kazanır.

İpuçları

sonlandırma:

Sonlu bir ondalık baskın paydasının en basit biçimde en fazla çarpanlara ayırması sadece 2 ve 5 lerden oluşur.

Tamamen Periyodik:

Tamamen periyodik bir ondalık basamağın paydasının en basit haliyle ana çarpanlara ayırması 2 ya da 5'i içermez.

Sonunda Periyodik:

Sonunda periyodik bir ondalık basamağın paydasının en basit haliyle ana çarpanlara ayırılması en az bir 2 veya 5 içerir, fakat aynı zamanda diğer sayıları da içerir.

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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



2
Bunun aslında bir kopya olduğunu düşünürsem , çok yakın bir oy kullanırdım. " Neredeyse " kelimesini kullanmamın bir nedeni var .
Peter Taylor

1
p / q şeklinde bir kesir verildi Nasıl verildi? Pay ve paydayı ayrı fonksiyon argümanları olarak alabilir miyiz?
Dennis,

2
Sonlandırmak için yanlış olan herhangi bir şey, tamamen periyodik olarak 1 ve sonunda periyodik olarak 1'den büyük herhangi bir şey gibi belirli bir koşulu karşılayan sabit olmayan bir değer verebilir miyiz?
ETHProductions

1
Hayır, 1/13 tamamen periyodik çünkü tekrar eden '076923'. 0, tekrarlayan ile tekrar eder.
Oliver Ni,

Yanıtlar:


8

Jöle , 10 bayt

:gÆfḍ⁵ṢQ¬Ḅ

Paydayı ve payını (bu sırayla) argüman olarak kabul eder. Sonlandırma için 0 , tamamen periyodik olarak 1 ve sonunda periyodik olarak 2 döndürür . Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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

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

İade 0 sonlanan için, gerçek tamamen periyodik ve sahte sonunda periyodik için.

Nasıl çalışır

Burada yaptığımız şey aslında elle bölünmeyi simüle etmektir:

  1. a?...:0- Pay sıfır ise, burada durur ve geri döneriz 0. Dizi sona eriyor .
  2. (s[a]^=a)?...:x==a- Daha önce bu payla karşılaştıysak, dizinin periyodik olduğu ve sonsuza dek tekrar edeceği anlamına gelir. Biz burada durun ve ya dönmek truedurumunda aisimli ilk değere eşit x(dizinin tamamen periyodik ) ya da falseeğer o değil ( en sonunda periyodik ).
  3. f(a*10%b,b,s,x||a)- Aksi taktirde, payı a10 ile çarpıyoruz . Bölmenin geri kalanını , payda ile hesaplıyoruz b. Ve bu kalanı yeni paytör olarak kullanarak süreci tekrar ediyoruz. (Ayrıca aönceden kaydedilmemişse, dizinin ilk değeri olarak geçeriz x.)

Örnek

  • Mavi : pay = 1
  • Yeşil : payda = 7
  • Kırmızı : 10'la çarpma
  • Siyah : kalanlar
  • Gri : bölüm sayıları (burada onları gerçekten önemsemedik ve yukarıdaki kod onları hiç hesaplamıyor)

bölünme


9

Python, 62 61 59 bayt

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

Yazdırır 1 , en sonunda düzenli için 2 sadece periyodik için ve 4 sonlanan için.

Tüm test durumlarını repl.it'te doğrulayın .


Büyüleyici! Ne yapar *r?
ETHProductions

R parçasını açar . f(1, *(2, 3), 4)eşittir f(1, 2, 3, 4).
Dennis,

Öyleyse bu JS'de 56 bayt olacaktır:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions 11:16

Kötü, 63 bayt ( inJS'de Python'dan çok farklı bir amaca hizmet ettiğini unuttum ):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

@ETHproductions Temiz. Sanırım f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)işe yarayacaktı.
Dennis,

6

Perl, 49 46 45 bayt

İçin +3 içerir -p

Dennis'in zarif fikrine dayanarak, ancak bir şekilde uygulandı

STDIN'e giriş numaraları verin

terminating.pl <<< "2 26"

termninating.pl:

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

Sonlandırılıyorsa 2 yazdırır. 1 periyodik ise ve sonunda periyodik ise hiçbir şey


Belirli bir gruptaki tüm sayılar aynı değeri vermek zorundadır.
Oliver Ni,

@OliverNi Şimdi yapıyorlar
Ton Hospel 11:16

3

Toplu iş, 247 bayt

@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

Hızlı gcd10 numaramı Fraksiyondan tam ondalık basamağa kadar kullanır . Açıkçası özel bir çıktı biçimi kullanarak bir sürü baytı kurtarabilirim.


Neden sadece @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E42 bayt kurtarmak için yapmıyorsun ?
ETHProductions

Açıkçası özel bir çıktı biçimi kullanarak bir sürü baytı kurtarabilirim.
Oliver Ni,

@ETHproductions, Oliver'ın bir alıntıyla belirttiği gibi, istemediğini düşünüyorum.
Outgolfer Erik

3

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

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

NaNSonlandırma, 1tamamen periyodik ve Infinitysonunda periyodik için çıktılar .

Test pasajı

açıklama

İlk olarak, her iki bölme n ve d ile gcd (d, n) en basit formu kısmını azaltmak için. Bu , sonucun tamamen periyodik olarak hesaplanacağı 2/6 gibi durumlardan kaçınmamızı sağlar . Ayrıca t değişkenini gcd (d, 10) olarak tanımlarız ; bu daha sonra kullanılacak.

Olup, ilk kontroldür , n ise 0 ya da d olan 1 . Eğer , n * (d-1) = 0, dönmek +fveya NaN : fraksiyon olan sonlandırma .

Bir sonraki kontrol olmadığıdır t olduğu 1 . Öyleyse, 1 değerini döndürürüz : kesir tamamen periyodiktir .

Eğer T olduğu değil 1 , bu ayırma d ile t ise 0 ile yeniden tek parça olarak çalıştırmak ve bölme N / (d / t) sona eriyor, bu geri dönüş , NaN / 0 = NaN fraksiyonu olup: sonlandırma . Aksi takdirde, 1/0 = Infinity döndürür : kesir sonunda periyodiktir .


En basit forma indirgeme nerede?
Ton Hospel

@TonHospel Sabit.
ETHProductions

@Arna, ne demek istediğinden emin değilim. InfinityTüm bu değerler için döner .
ETHProductions

@Hadi Aw, dostum, asla ayarlama yapmadan kurtulabileceğimi düşündüm n... Buna dikkat çektiğin için teşekkürler.
ETHProductions,

3

Mathematica, 41 bayt

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

Girdide bitişik {3,1,2}bir ondalık genişlemesi {2,3,1}varsa, giriş yalnızca periyodik bir ondalık genişlemeye {3,2,1}sahipse ve girişin sonunda periyodik bir ondalık genişlemeye sahipse çıktılar .

Sinsi numaraya dayanarak: den düşük derecede kesir paydası ise, en büyük ortak bölen dve asal çarpanlarında sadece 2 ve 5'li varsa 10^deşittir ; asal çarpanlaştırmasında ne 2 ne de 5'e sahip değilse eşittir ; ve eğer 2s / 5s ile diğer primerlere sahipse , bazı tam sayılara eşittir .dd1dd

OrderingÜçlü bir sonraki en küçük, en küçük ve en büyük unsurlardır nerede bağları soldan sağa kırık ile fonksiyon sadece, raporlar.

Kusur: varyant çıkışı verir {1,2,3}yerine {3,1,2}giriş 0 ise.

Mathematica, 46 bayt, sapık

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

Girdide bitişik a[[1]]bir ondalık genişlemesi b[[1]]varsa, giriş tamamen periyodik bir ondalık genişlemeye b[a]sahipse ve girişin sonunda periyodik ondalık ondalık genişlemeye sahipse döndürür . Her durumda bir hata atar!

Yukarıdaki gibi, en büyük ortak bölenin 1, d veya aralarında bir yere eşit olup olmadığını bilmek istiyoruz. Bu gcd'nin baz-d logaritması, 0, 1 veya aradaki bir şeye eşittir.

Şimdi Mathematica'ya işkence etmeye başlıyoruz. İfadenin th bölümünü b[a][[n]]belirtir . Böylece döner ; döner ; ve , 0 ile 1 arasında bir sayı olduğunda, Mathematica'nın "Part :: pkspec1: İfade bir parça belirtimi olarak kullanılamaz " hatasını veriyor . ve değerlenmemiş döner .nb[a]b[a][[1]]ab[a][[0]]bb[a][[x]]xxb[a][[x]]

Bu, hali hazırda periyodik vakanın çıktısının b[a][[x]]sabit olmadığı x, çünkü bir şeyin gerçek logaritması olması haricinde, bu üç vakayı uygun şekilde ayırt ediyor . Bu yüzden daha [[1]]önce tarif edilen çıktılara başvuruyoruz . Mathematica'nın dahili olarak temsil ettiği için b[a][[x]], bunun sonucu b[a][[x]][[1]]basitçedir b[a]. Öte yandan, farklı bir hatayla sonuçlanmak [[1]]için başvurmak a"Part :: partd: Bölüm özellikleri a [[1]] nesnenin derinliğinden daha uzun." ve a[[1]]değerlenmemiş (ve benzer şekilde) için döner b.

Hata: b[a]yerine giriş 0 ile ilgili yalan a[[1]].


2

C 173 Bayt

Stdin'den iki tamsayı alır, tamamen periyodik için 1, sonunda periyodik için -1 ve sonlandırma için 0 yazdırır.

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

Yarım golfed:

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

Aslında 15 bayt

Bu Dennis'in Jelly cevabına dayanıyor . 0 sona ermektedir, 1 tamamen periyodiktir ve 2 sonunda periyodiktir. Golf önerileri kabul edilir. Çevrimiçi deneyin!

▼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 bayt

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

NullSonlandırma için İadeler ,True tamamen periyodik ve Falsesonunda periyodik için .

açıklama

RealDigits

N'nin ondalık genişlemesini bulun (tekrarlanan rakamlar fazladan bir kafa ile çevrilidir List {}).

ListQ@Last@#

Ondalık açılımın son elemanının a olup olmadığını kontrol edin List.

Length@#==1

Yukarıdaki koşul ise True, ondalık genişlemenin tamamının tek bir şeyden oluşup oluşmadığını kontrol edin. (Bir Listvarlık olarak sayılır). (döner Trueveya False)

(Koşul buysa, Falsea Nulldöndürülür çünkü üçüncü bir argüman yoktur If)


1

Pyth , 31 27 bayt

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

Giriş

4,12

Burada deneyebilirsiniz . Baskılar 1 , en sonunda düzenli için 2 sadece periyodik için ve 0 sonlanan için. Bu benim ilk defa kodlayıcıya cevap veriyorum. Herhangi bir öneriniz açıktır.

açıklama

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

[2,3] [2,5] = [2], ancak [2,3,5] - [2,5] = [3] tarafından filtrelenmiş olduğuna dikkat edin.


1

PARI / GP, 64 bayt

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

Sonlandırma için hiçbir şey, yalnızca tamamen 0 ve sonunda periyodik olarak 1 çıktılar.

Çok süslü değil, başladığımda daha iyi bir şey umuyordum.


1

05AB1E , 16 11 bayt

@Adnan sayesinde 5 bayt kaydedildi!

¿²r/fTrÖbÙJ

Tamamen Periyodik, Sonlandırmak için 1 ve En Son Periyodik için 10 yazdırır.

Açıklama:

                 # 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

Girdi p newline q olarak alınır .

Çevrimiçi deneyin!


05AB1E :) kullanarak sizi görmek güzel. Osabie ayrıca ilk ikisini de çıkarmamıza izin veren örtük girdi kullanır I. Bundan başka, bir sabite önceden tanımlanmış 10olan T. Aynı 2B, b:).
Adnan,

¿²r/fTrÖbÙJSon kod olarak bize veren giriş kayıtlarını da kullanabilirsiniz :).
Adnan,

1

PHP, 126 Bayt

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

Sonlandırılmış için 0, sonunda yalnızca periyodik 2 için 1 yazdırır. O feshedilmesi halinde bir pay burada dizide iki kez ise Açıklayayım periyodik oturumu başlatır echo end($a);değerdir 0 beni koymak güven Değilse $t=count($a)>$d?2:0;döngüde

Daha açık ekleyin yapmak için print_r($a);veya var_dump($a);veya json_encode($a);döngü sonrasında

Bir pay iki kere maddeyi iki kez sayıyorsa, dizinin sonunda iki veya sıfır bir numara görebilirsiniz ve periyodikin uzunluğunu alabilir ve periyodiklerin başladığı ilk numara ile pozisyonu görebilirsiniz.

Bundan sonra periyodik dizinin konumunu ve uzunluğunu bulabiliriz. if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Periyodik görselleştirmek

$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

Çıktı periyodik terimi görselleştirir

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

130 Bayt ile başka bir yol

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

Genişletilmiş Versiyon

$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


@ Ne demek istiyorsun, diğer soruyu cevaplamak için kodu değiştirmeliyim?
Jörg Hülsermann

Şey, sadece diğer sorunun PHP cevabı olmadığını düşünüyordum; belki bir tane sağlamak istersiniz.
Neil

@RosLuP 3/53 örneği için bu dizi oluşturulacak[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann

3/103 = 0.0291262135922330097087378640776699029126213592233009708 ve benzerleri aynı dönemde aynı rakamla görünebilir (örneğin, yukarıdaki 00 ... 00 arasındaki 7 rakamı) Ancak, bahsettiğiniz dizi rakam rakamdan değil, rakamlardan biriyse haneli bunun her dönemde tek bir değer d_i orada ok düşünmek daha d / c = 10 * (d% b)} ...
RosLuP
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.