Mengakhiri, Murni Berkala, atau Akhirnya Berkala?

21

pengantar

Desimal akan berakhir jika memiliki jumlah digit desimal yang terbatas. Misalnya, 0,4 (2/5) berakhir karena memiliki satu angka desimal.

Sebuah desimal murni periodik jika memiliki angka desimal angka tak terbatas dan tidak memiliki angka desimal sebelum pengulangannya (bagian dari desimal yang berulang.) Misalnya, 0,142857142857142… (1/7) murni periodik karena ia memiliki pengulangan berulang 142857, yang mulai berulang segera setelah titik desimal.

Suatu desimal pada akhirnya periodik jika memiliki angka desimal angka tak terhingga dan memiliki angka desimal angka hingga sebelum berulang (bagian dari desimal yang berulang.) Misalnya, 0.16666666666666666 ... (1/6) akhirnya periodik karena repetend 6 mulai berulang setelah 1.

Tugas Anda

Tulis sebuah program atau fungsi yang, ketika diberi angka p dan q (bilangan bulat, 0 <= p < q <= 100), akan menentukan apakah representasi desimal p / q berakhir, murni periodik, atau akhirnya periodik.

Anda harus keluaran ajika itu Pengakhiran (yaitu 0,1), bjika Murni periodik (yaitu 0,333 ...), atau cjika itu Akhirnya periodik (yaitu 0,166 ...), di mana a, bdan capapun yang berbeda, string konstan pilihan Anda.

Uji kasus

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

Anda dapat menemukan semua kasus uji di sini .

Anda diizinkan untuk memilih 3 nilai Anda sendiri untuk output, tetapi harus jelas yang mana itu.

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Petunjuk

Mengakhiri:

Faktorisasi utama dari denominator terminasi terminasi dalam bentuk paling sederhana hanya terdiri dari 2s dan 5s.

Murni periodik:

Faktorisasi utama dari penyebut desimal murni periodik dalam bentuk paling sederhana tidak termasuk 2s atau 5s.

Akhirnya Berkala:

Faktorisasi utama dari penyebut desimal periodik akhirnya dalam bentuk paling sederhana termasuk setidaknya satu 2 atau 5, tetapi juga termasuk angka lainnya.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Oliver Ni
sumber
2
Hampir duplikat
Peter Taylor
2
Jika saya pikir itu sebenarnya duplikat, saya akan memberikan suara dekat. Ada alasan mengapa saya menggunakan kata " hampir ".
Peter Taylor
1
diberikan sebagian kecil dalam bentuk p / q Mengingat bagaimana? Bisakah kita mengambil pembilang dan penyebut sebagai argumen fungsi yang terpisah?
Dennis
2
Bisakah kita menghasilkan nilai tidak konstan yang memenuhi kondisi tertentu, seperti sesuatu yang palsu untuk diakhiri, 1 untuk murni periodik, dan apa pun yang lebih besar dari 1 untuk akhirnya periodik?
ETHproduk
1
Tidak, 1/13 murni periodik karena yang berulang adalah '076923'. 0 berulang dengan pengulangan.
Oliver Ni

Jawaban:

8

Jelly , 10 byte

:gÆfḍ⁵ṢQ¬Ḅ

Terima penyebut dan pembilang (dalam urutan itu) sebagai argumen. Mengembalikan 0 untuk mengakhiri, 1 untuk murni periodik, dan 2 untuk akhirnya periodik. Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

: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
sumber
11

JavaScript (ES6), 70 .. 68 53 byte

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

Mengembalikan 0 untuk mengakhiri, benar untuk murni periodik dan salah untuk akhirnya periodik.

Bagaimana itu bekerja

Apa yang kami lakukan di sini sebenarnya mensimulasikan pembagian dengan tangan:

  1. a?...:0- Jika pembilangnya nol, kita berhenti di sini dan kembali 0. Urutannya berakhir .
  2. (s[a]^=a)?...:x==a- Jika kita pernah menemukan pembilang ini sebelumnya, itu berarti bahwa urutannya periodik dan akan berulang selamanya. Kami berhenti di sini dan kembali truejika asama dengan nilai pertama xdari urutan ( murni periodik ) atau falsejika tidak ( akhirnya berkala ).
  3. f(a*10%b,b,s,x||a)- Lain, kita gandakan pembilangnya adengan 10. Kita menghitung sisa pembagian dengan penyebut b. Dan kami mengulangi prosesnya dengan menggunakan sisa ini sebagai pembilang baru. (Kami juga meneruskan asebagai nilai pertama dari urutan jika belum disimpan x.)

Contoh

  • Biru : pembilang = 1
  • Hijau : penyebut = 7
  • Merah : perkalian dengan 10
  • Hitam : sisa
  • Gray : digit hasil bagi (kami tidak benar-benar peduli tentang mereka di sini, dan kode di atas tidak menghitungnya sama sekali)

divisi

Arnauld
sumber
9

Python, 62 61 59 byte

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

Mencetak 1 untuk akhirnya periodik, 2 untuk murni periodik, dan 4 untuk mengakhiri.

Memverifikasi semua kasus uji pada repl.it .

Dennis
sumber
Menarik! Apa yang *rharus dilakukan
ETHproduk
Itu membongkar tuple r . f(1, *(2, 3), 4)setara dengan f(1, 2, 3, 4).
Dennis
Jadi ini akan menjadi 56 byte di JS:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproduk
Buruk saya, 63 byte (saya lupa bahwa inmelayani tujuan yang sangat berbeda di JS daripada di Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproduksi
@ EHProduk Rapi. Saya kira f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)akan bekerja juga.
Dennis
6

Perl, 49 46 45 byte

Termasuk +3 untuk -p

Didasarkan pada ide elegan Dennis tetapi diimplementasikan dengan cara perlish

Berikan nomor input pada STDIN

terminating.pl <<< "2 26"

termninating.pl:

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

Mencetak 2 jika terminasi. 1 jika periodik dan tidak ada jika akhirnya periodik

Ton Hospel
sumber
Semua angka dalam kelompok tertentu harus memberikan nilai yang sama.
Oliver Ni
@OliverNi Mereka melakukannya sekarang
Ton Hospel
3

Batch, 247 byte

@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

Menggunakan trik gcd10 cepat saya dari Fraksi ke desimal yang tepat . Jelas saya bisa menyimpan banyak byte dengan menggunakan format output khusus.

Neil
sumber
Mengapa tidak Anda lakukan saja @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Euntuk menghemat 42 byte?
ETHproduksi
Jelas saya bisa menyimpan banyak byte dengan menggunakan format output khusus.
Oliver Ni
@ ETHproductions Saya pikir dia tidak mau, seperti yang telah dicatat Oliver dengan kutipan.
Erik the 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

Keluaran NaNuntuk penghentian, 1untuk murni periodik, dan Infinityuntuk akhirnya periodik.

Cuplikan tes

Penjelasan

Pertama, kita membagi n dan d dengan gcd (d, n) , untuk mengurangi pecahan menjadi bentuk yang paling sederhana. Ini memungkinkan kita menghindari situasi seperti 2/6 di mana hasilnya akan dihitung sebagai murni periodik. Kami juga mendefinisikan variabel t sebagai gcd (d, 10) ; ini akan digunakan nanti.

Pemeriksaan pertama adalah apakah n adalah 0 atau d adalah 1 . Jika n * (d-1) adalah 0, kita kembali +f, atau NaN : pecahannya berakhir .

Pemeriksaan selanjutnya adalah apakah t adalah 1 . Jika demikian, kita mengembalikan 1 : fraksi ini murni periodik .

Jika t adalah tidak 1 , kita membagi d oleh t , menjalankan seluruh fungsi lagi, dan bagi dengan 0. Jika n / (d / t) adalah terminating, hasil ini NaN / 0 = NaN : fraksi tersebut mengakhiri . Kalau tidak, ia mengembalikan 1/0 = Infinity : fraksi akhirnya periodik .

Produksi ETH
sumber
Di mana reduksi ke bentuk paling sederhana?
Ton Hospel
@TonHospel Diperbaiki.
ETHproduksi
@Arnauld Saya tidak yakin apa yang Anda maksud. Ia mengembalikan Infinitysemua nilai-nilai itu.
ETHproduksi
@Arnauld Aw, kawan, saya pikir saya bisa lolos dengan tidak pernah menyesuaikan n... Terima kasih telah menunjukkannya.
ETHproduksi
3

Mathematica, 41 byte

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

Output {3,1,2}jika input memiliki ekspansi desimal terminasi, {2,3,1}jika input memiliki ekspansi desimal murni periodik, dan {3,2,1}jika input memiliki ekspansi desimal akhirnya secara berkala.

Berdasarkan trik licik: jika dadalah penyebut dari fraksi dalam istilah terendah, maka pembagi umum terbesar darid dan 10^dsama djika dhanya memiliki 2s dan 5s dalam faktorisasi utamanya; sama dengan 1jika dtidak memiliki 2s atau 5s dalam faktorisasi utamanya; dan sama dengan bilangan bulat di antara jika dmemiliki 2s / 5s dan bilangan prima lainnya.

The OrderingFungsi hanya melaporkan di mana unsur-unsur terkecil, terkecil berikutnya, dan terbesar dari tiga yang, dengan ikatan patah kiri ke kanan.

Cacat: mengembalikan varian keluaran {1,2,3}daripada {3,1,2}jika inputnya adalah 0.

Mathematica, 46 byte, sesat

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

Kembali a[[1]] jika input memiliki ekspansi desimal terminasi, b[[1]]jika input memiliki ekspansi desimal murni periodik, dan b[a]jika input memiliki ekspansi desimal akhirnya secara berkala. Melempar kesalahan dalam semua kasus!

Seperti di atas, kita ingin tahu apakah pembagi umum terbesar sama dengan 1, d, atau di suatu tempat di antaranya. Logaritma dasar-d dari gcd itu sama dengan 0, 1, atau sesuatu di antaranya.

Sekarang kita mulai menyiksa Mathematica. b[a][[n]]menunjukkan bagian nth dari ekspresi b[a]. Jadi b[a][[1]]kembali a; b[a][[0]]pengembalian b; dan b[a][[x]]dimanax angka antara 0 dan 1, membuat Mathematica melempar kesalahan "Bagian :: pkspec1: Ekspresi xtidak dapat digunakan sebagai spesifikasi bagian." dan pengembalian tidak b[a][[x]]dievaluasi.

Ini sudah membedakan tiga kasus dengan tepat, kecuali bahwa output untuk kasus akhirnya periodik adalah b[a][[x]] , yang tidak konstan karena xmerupakan logaritma aktual dari sesuatu. Jadi kita berlaku [[1]]untuk output yang sudah dijelaskan. Karena bagaimana Mathematica mewakili secara internal b[a][[x]], hasilnya b[a][[x]][[1]]sederhana b[a]. Di sisi lain, menerapkan [[1]]untuk ahasil dalam kesalahan yang berbeda "Bagian :: partd:. Bagian spesifikasi [[1]] lebih panjang dari kedalaman objek" dan pengembalian tidak a[[1]]dievaluasi (dan juga untuk b).

Cacat: kebohongan tentang input 0, b[a]bukannya kembali a[[1]].

Greg Martin
sumber
2

C 173 Bytes

Mengambil dua bilangan bulat dari stdin, mencetak 1 untuk murni periodik, -1 untuk akhirnya periodik, dan 0 untuk terminasi.

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

Tidak Disatukan:

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

Setengah 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
sumber
2

Sebenarnya , 15 byte

Ini didasarkan pada jawaban Dennis 'Jelly . 0 berakhir, 1 murni periodik, dan 2 akhirnya periodik. Saran golf diterima. Cobalah online!

▼Ny9u♀%SR♂b╔2@¿

Tidak melakukanolf

      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
sumber
1

Mathematica, 44 byte

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

Pengembalian Nulluntuk Pengakhiran,True untuk murni periodik, dan Falseuntuk akhirnya periodik.

Penjelasan

RealDigits

Temukan ekspansi desimal N. (angka berulang dikelilingi oleh kepala tambahan List {}).

ListQ@Last@#

Periksa apakah elemen terakhir ekspansi desimal adalah a List.

Length@#==1

Jika kondisi di atas adalah True, periksa apakah seluruh ekspansi desimal terdiri dari satu hal. (SEBUAHList dihitung sebagai satu entitas). (pengembalianTrue atau False)

(Jika kondisinya demikian False, maka a Nulldikembalikan karena tidak ada argumen ketiga untuk If)

JungHwan Min
sumber
1

Pyth , 31 27 byte

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

Memasukkan

4,12

Anda bisa mencobanya di sini . Mencetak 1 untuk akhirnya periodik, 2 untuk murni periodik, dan 0 untuk mengakhiri. Ini adalah pertama kalinya saya menjawab dalam codegolf. Semua saran dipersilahkan.

Penjelasan

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

Perhatikan bahwa [2,3] difilter oleh [2,5] = [2] tetapi [2,3,5] - [2,5] = [3].

Joshua
sumber
1

PARI / GP, 64 byte

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

Tidak menghasilkan apa pun untuk diakhiri, 0 untuk murni dan 1 untuk akhirnya periodik.

Tidak terlalu mewah, saya berharap sesuatu yang lebih baik ketika saya mulai.

Sievers Kristen
sumber
1

05AB1E , 16 11 byte

Disimpan 5 byte berkat @Adnan!

¿²r/fTrÖbÙJ

Mencetak 0 untuk Purely Periodic, 1 untuk Terminating, dan 10 untuk akhirnya Periodic.

Penjelasan:

                 # 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

Input diambil sebagai p baris baru q .

Cobalah online!

Oliver Ni
sumber
Senang melihat Anda menggunakan 05AB1E :). Osabie juga menggunakan input implisit yang memungkinkan kami untuk menghapus dua yang pertama I. Lebih lanjut, konstanta yang ditentukan sebelumnya 10adalah T. Sama untuk 2B, yaitu b:).
Adnan
Anda juga dapat menggunakan register input, yang memberi kami ¿²r/fTrÖbÙJkode terakhir :).
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;

Mencetak 0 untuk diakhiri dan 1 untuk murni periodik 2 untuk akhirnya. Biarkan saya jelaskan jika pembilang dua kali dalam array di sini memulai sesi periodik jika diakhiri echo end($a);nilainya 0 Jika Anda tidak percaya saya letakkan $t=count($a)>$d?2:0;di loop

Untuk membuatnya lebih jelas, silakan tambahkan print_r($a);atau var_dump($a);ataujson_encode($a); setelah loop

Anda dapat melihat satu pembilang dua kali atau nol pada akhir array jika pembilang dua kali menghitung item antara dua item dan Anda bisa mendapatkan panjang periodik dan Anda dapat melihat posisi oleh pembilang pertama di mana periodik dimulai

Jadi setelah itu kita dapat menemukan posisi dan panjang urutan periodik dengan if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Visualisasikan yang periodik

$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

Output memvisualisasikan istilah periodik

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

Cara lain dengan 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 yang Diperluas

$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
sumber
Lihat juga Fraksi ke desimal yang tepat .
Neil
@Neil maksudmu aku harus memodifikasi kode untuk menjawab pertanyaan lain?
Jörg Hülsermann
Yah, saya hanya berpikir pertanyaan lain tidak memiliki jawaban PHP; mungkin Anda ingin menyediakannya.
Neil
@RosLuP Sebagai contoh 3/53 array ini akan dibuat[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann
3/103 = 0.0291262135922330097087378640776699029126213592233009708 dan pada periode yang sama dapat muncul digit yang sama (misalnya digit 7 antara 00 ... 00 di atas). Tetapi jika larik yang Anda bicarakan bukan larik satu tetapi larik {d = 10 * (d% b)} di mana digitnya adalah d / c daripada yang saya pikir tidak apa-apa, hanya ada satu nilai d_i untuk setiap periode ...
RosLuP