Temukan repetend dari representasi desimal!

12

Dalam tantangan ini 2 tahun yang lalu, kami menemukan periode fraksi satuan ( 1/n where n is a natural number).

Sekarang, tugas Anda adalah menulis program / fungsi untuk menemukan repetend dari fraksi unit.

The repetend adalah bagian dari ekspansi desimal yang berulang jauh, seperti:

  • Representasi desimal dari 1/6adalah 0.16666..., maka repetend adalah 6.
  • Representasi desimal dari 1/11adalah 0.090909..., maka repetend adalah 09.
  • Representasi desimal dari 1/28adalah 0.0357142857142857142857..., maka repetend adalah 571428.

Spesifikasi

  • Masukkan dalam format apa pun yang masuk akal.
  • Keluarkan repetend dalam desimal, string atau daftar .
  • Untuk 1/7( 0.142857142857...), Anda harus menampilkan, 142857bukan 428571.
  • Untuk 1/13( 0.076923076923076923...), Anda harus menampilkan, 076923bukan 76923.
  • Tolong, jangan ada kekerasan.

Testcases

Input    Output
1        0
2        0
3        3
7        142857
13       076923
17       0588235294117647
28       571428
70       142857
98       102040816326530612244897959183673469387755
9899     000101020305081321345590463683200323264976260228305889483786241034447924032730578846348115971310233356904737852308313971108192746742095161127386604707546216789574704515607637135064147893726639054449944438832205273259925244974239822204263056874431760783917567431053641781998181634508536215779371653702394181230427315890493989291847661379937367410849580765733912516415799575714718658450348520052530558642287099707041115264168097787655318719062531568845337912920497019901

Mencetak gol

Ini adalah . Solusi terpendek dalam byte menang.

Tidak ada jawaban yang akan diterima, karena tujuannya bukan untuk menemukan bahasa yang mampu menghasilkan solusi terpendek, tetapi solusi terpendek dalam setiap bahasa.

Papan peringkat

Biarawati Bocor
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
Rɪᴋᴇʀ
1
Bagaimana Anda memutuskan bahwa repetend untuk 13 adalah 076923 dan bukan 769230?
Aditsu berhenti karena SE adalah JAHAT
@aditsu Karena 1/13ini 0.076923076923...bukan0.769230769230...
Leaky Nun
3
Secara terbuka menyatakan bahwa Anda tidak akan pernah menerima jawaban cukup banyak membuat ini katalog. Hanya saja, jangan katakan apa pun dan jangan pernah menerima jawaban.
Dennis
1
Anda bisa menambahkan potongan stack untuk menunjukkan solusi terpendek untuk setiap bahasa.
Aditsu berhenti karena SE adalah JAHAT

Jawaban:

5

Java, 150 byte:

String p(int n){int a=1,p;String r="";for(;n%10<1;n/=10);for(;n%2<1;n/=2)a*=5;for(;n%5<1;n/=5)a*=2;for(p=a%=n;;){p*=10;r+=p/n;if(a==(p%=n))return r;}}

Menambahkan spasi putih:

String p(int n){
    int a=1,p;
    String r="";
    for(;n%10<1;n/=10);
    for(;n%2<1;n/=2)
        a*=5;
    for(;n%5<1;n/=5)
        a*=2;
    for(p=a%=n;;){
        p*=10;
        r+=p/n;
        if(a==(p%=n))
            return r;
    }
}

Tidak lengkap, program lengkap:

import java.util.Scanner;

public class A036275 {
    public static String period(int a,int n){
        if(n%10==0) return period(a,n/10);
        if(n%2==0) return period(a*5,n/2);
        if(n%5==0) return period(a*2,n/5);
        a %= n;
        int pow = a;
        String period = "";
        while(true){
            pow *= 10;
            period += pow/n;
            pow %= n;
            if(pow == a){
                return period;
            }
        }
    }
    public static String period(int n){
        return period(1,n);
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        System.out.println(period(n));
    }
}
Biarawati Bocor
sumber
for(;;)akan lebih sedikit byte daripada while(2<3)meskipun sementara juga menjadi loop tak terbatas! (dan kurang dari byte while(1)juga @Maltysen)
Marv
@ Marv Bagaimana saya bisa lupa itu? Terima kasih!
Leaky Nun
Letakkan deklarasi untuk adan rdi dalam for loop. Menghemat byte!
CalculatorFeline
1
@CatsAreFluffy Ini akan membuat mereka tidak dapat diakses ...
Leaky Nun
3

CJam, 26

riL{_XW$%A*:X|X@-}g_X#>\f/

Cobalah online

Penjelasan:

Program ini membangun serangkaian dividen yang terlibat dalam perhitungan ekspansi desimal, sampai menemukan dividen yang telah dilihat sebelumnya. Kemudian dibutuhkan semua dividen dimulai dengan yang itu, dan membaginya dengan n untuk mendapatkan digit dari repetend.

ri       read the input and convert to integer (n)
L        push an empty array (will add the dividends to it)
{…}g     do … while
  _      copy the current array of dividends
  X      push the latest dividend (initially 1 by default)
  W$     copy n from the bottom of the stack
  %A*    calculate X mod n and multiply by 10
  :X     store in X (this is the next dividend)
  |      perform set union with the array of dividends
  X@     push X and bring the old array to the top
  -      set difference; it is empty iff the old array already contained X
          this becomes the do-while loop condition
_X#      duplicate the array of dividends and find the position of X
>        take all dividends from that position
\f/      swap the array with n and divide all dividends by n
aditsu berhenti karena SE adalah JAHAT
sumber
3

Python 3.5, 79 74 73 70 byte

f=lambda n,t=1,q=[],*d:q[(*d,t).index(t):]or f(n,t%n*10,q+[t//n],*d,t)

Disimpan 3 byte dengan melacak dividen, ide yang saya ambil dari jawaban CJam @ aditsu .

Mengujinya pada repl.it .

Dennis
sumber
2

Jelly , 12 10 byte

%³×⁵
1ÇÐḶ:

Disimpan 2 byte dengan melacak dividen, ide yang saya ambil dari jawaban CJam @ aditsu .

Cobalah online!

Bagaimana itu bekerja

%³×⁵     Helper link. Argument: d (dividend)

%³       Yield the remainder of the division of d by n.
  ×⁵     Multiply by 10.


1ÇÐḶ:    Main link. Argument: n

1        Yield 1 (initial dividend).
 ÇÐḶ     Apply the helper link until its results are no longer unique.
         Yield the loop, i.e., everything from the first repeated result
         up to and including the last unique one.
    :    Divide each dividend by n.
Dennis
sumber
1

Bahasa GameMaker, 152 byte

Berdasarkan jawaban Kenny

n=argument0;a=1r=0while(n mod 2<1){a*=5n/=2}while(n mod 5<1){a*=2n/=5}a=a mod n;p=a;while(1){p*=10r=r*10+p/n;r=r mod $5f5e107;p=p mod n;if(a=p)return r}
Timtech
sumber
Saya baru saja menemukan bug dalam pendekatan saya dan memperbaikinya, jadi mungkin Anda perlu memperbarui ini juga.
Leaky Nun
1

Jawa, 122

String f(int n){String r="";int x=1,a[]=new
int[n*10];while(a[x]++<1)x=x%n*10;do{r+=x/n;x=x%n*10;}while(a[x]<2);return r;}

Mirip dengan solusi CJam saya.

aditsu berhenti karena SE adalah JAHAT
sumber
1

Perl 6 , 37 byte

{(1.FatRat/$_).base-repeating[1]||~0}
~0 max (1.FatRat/*).base-repeating[1]

Jika Anda tidak peduli bahwa itu hanya akan bekerja dengan penyebut yang cocok dengan integer 64 bit, Anda dapat menghapus pemanggilan metode .FatRat.

Penjelasan:

# return 「"0"」 if 「.base-repeating」 would return 「""」
~0

# 「&infix<max>」 returns the numerically largest value
# or it's first value if they are numerically equal
max

(
  # turn 1 into a FatRat so it will work
  # with denominators of arbitrary size
  1.FatRat

  # divided by
  /

  # the input
  *

# get the second value from calling the
# method 「.base-repeating」
).base-repeating[1]

Uji:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &code = ~0 max (1.FatRat/*).base-repeating[1];
# stupid highlighter */
# Perl has never had // or /* */ comments

my @tests = (
  1    => '0',
  2    => '0',
  3    => '3',
  6    => '6',
  7    => '142857',
  11   => '09',
  13   => '076923',
  17   => '0588235294117647',
  28   => '571428',
  70   => '142857',
  98   => '102040816326530612244897959183673469387755',
  9899 => '000101020305081321345590463683200323264976260228305889483786241034447924032730578846348115971310233356904737852308313971108192746742095161127386604707546216789574704515607637135064147893726639054449944438832205273259925244974239822204263056874431760783917567431053641781998181634508536215779371653702394181230427315890493989291847661379937367410849580765733912516415799575714718658450348520052530558642287099707041115264168097787655318719062531568845337912920497019901',
);

plan +@tests;

for @tests -> $_ ( :key($input), :value($expected) ) {
  is code($input), $expected, "1/$input";
}
1..12
ok 1 - 1/1
ok 2 - 1/2
ok 3 - 1/3
ok 4 - 1/6
ok 5 - 1/7
ok 6 - 1/11
ok 7 - 1/13
ok 8 - 1/17
ok 9 - 1/28
ok 10 - 1/70
ok 11 - 1/98
ok 12 - 1/9899
Brad Gilbert b2gills
sumber
0

Pyth, 63 byte

W!%QT=/QT;J*F+1-PQ,2 5K%*F+1-L7@,2 5PQJ=NKW1=+k/=*NTJIqK=%NJB;k

Cobalah online!

Terjemahan langsung dari jawabannya di Jawa .

Biarawati Bocor
sumber
0

PHP, 169 Bytes

$d=$argv[2];$a[]=$n=$argv[1];while($n%$d&&!$t){$n*=10;$r[]=$n/$d^0;$t=in_array($n%=$d,$a);$a[]=$n;}if($t)echo join(array_slice($r,array_search(end($a),$a),count($a)-1));
Jörg Hülsermann
sumber