Finden Sie die Wiederholung der Dezimaldarstellung!


12

In dieser Herausforderung vor 2 Jahren haben wir die Periode eines Einheitsbruchteils ( 1/n where n is a natural number) gefunden.

Ihre Aufgabe ist es nun, ein Programm / eine Funktion zu schreiben, um die Wiederholung eines Einheitenbruchteils zu finden .

Die Wiederholung ist der Teil der Dezimalerweiterung, der sich unendlich wiederholt, wie:

  • Die Dezimaldarstellung 1/6heißt 0.16666..., dann wird die Periode ist 6.
  • Die dezimale Darstellung von 1/11ist 0.090909..., dann ist die Wiederholung 09.
  • Die dezimale Darstellung von 1/28ist 0.0357142857142857142857..., dann ist die Wiederholung 571428.

Technische Daten

  • Eingabe in einem angemessenen Format.
  • Geben Sie die Wiederholung als Dezimalzahl, Zeichenfolge oder Liste aus .
  • Für 1/7( 0.142857142857...) müssen Sie 142857anstelle von ausgeben 428571.
  • Für 1/13( 0.076923076923076923...) müssen Sie 076923anstelle von ausgeben 76923.
  • Bitte keine rohe Gewalt.

Testfälle

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

Wertung

Das ist . Kürzeste Lösung in Bytes gewinnen.

Es wird keine Antwort akzeptiert, da das Ziel nicht darin besteht, die Sprache zu finden, die die kürzeste Lösung liefert, sondern die kürzeste Lösung in jeder Sprache.

Bestenliste



1
Wie entscheiden Sie, dass die Wiederholung für 13 076923 und nicht 769230 ist?
aditsu kündigte, weil SE ist EVIL

@Aditsu Weil 1/13es 0.076923076923...nicht ist0.769230769230...
Leaky Nun

3
Die Tatsache, dass Sie niemals eine Antwort annehmen werden, macht dies zu einem Katalog. Sag einfach nichts und akzeptiere niemals eine Antwort.
Dennis

1
Sie können ein Stack-Snippet hinzufügen, um die kürzeste Lösung für jede Sprache anzuzeigen.
aditsu kündigte, weil SE ist EVIL

Antworten:


5

Java, 150 Bytes:

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

Leerzeichen hinzugefügt:

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

Ungolfed, volles Programm:

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

for(;;)wäre weniger bytes als while(2<3)obwohl dabei auch eine endlosschleife! (und weniger Bytes als while(1)auch @Maltysen)
Marv

@Marv Wie hätte ich das vergessen können? Vielen Dank!
Undichte Nonne

Schreiben Sie die Deklarationen für aund rin die for-Schleifen. Spart Bytes!
CalculatorFeline

1
@CatsAreFluffy Es würde sie unzugänglich machen ...
Undichte Nonne

3

CJam, 26

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

Probieren Sie es online aus

Erläuterung:

Das Programm erstellt eine Reihe von Dividenden, die in die Berechnung der Dezimalexpansion einbezogen sind, bis es eine Dividende findet, die es zuvor gesehen hat. Dann werden alle Dividenden, die mit dieser beginnen, durch n dividiert, um die Ziffern der Wiederholung zu erhalten.

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


2

Gelee , 12 10 Bytes

%³×⁵
1ÇÐḶ:

2 Bytes gespart, indem Dividenden nachverfolgt wurden , eine Idee, die ich aus @ aditsus CJam-Antwort übernommen habe .

Probieren Sie es online!

Wie es funktioniert

%³×⁵     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.

1

GameMaker-Sprache, 152 Byte

Basierend auf Kennys Antwort

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}

Ich habe gerade einen Fehler in meinem Ansatz gefunden und ihn behoben. Vielleicht müssten Sie diesen auch aktualisieren.
Undichte Nonne

1

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

Ähnlich wie bei meiner CJam-Lösung.


1

Perl 6 , 37 Bytes

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

Wenn es Ihnen egal ist, dass es nur mit Nennern funktioniert, die in eine 64-Bit-Ganzzahl passen, können Sie den Methodenaufruf für entfernen .FatRat .

Erläuterung:

# 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]

Prüfung:

#! /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


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));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.