Знайдіть повторення десяткового подання!


12

У цьому виклику 2 роки тому ми знайшли період одиничної фракції ( 1/n where n is a natural number).

Тепер ваше завдання - написати програму / функцію, щоб знайти повторення одиничного дробу.

Рефрен є частиною розширення десяткового повторює нескінченно, як:

  • Десяткове подання 1/6IS 0.16666..., то рефрен є 6.
  • Десяткове подання 1/11є 0.090909..., тоді є повторення 09.
  • Десяткове подання 1/28є 0.0357142857142857142857..., тоді є повторення 571428.

Технічні характеристики

  • Введіть у будь-якому розумному форматі.
  • Виведіть повторення у десятковій, рядковій або списку .
  • Для 1/7( 0.142857142857...), ви повинні вивести 142857замість 428571.
  • Для 1/13( 0.076923076923076923...), ви повинні вивести 076923замість 76923.
  • Немайте грубої сили, будь ласка.

Тестові шафи

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

Оцінка балів

Це . Найкоротше рішення виграти в байтах.

Жодної відповіді не було б прийнято, оскільки мета полягає не в тому, щоб знайти мову, здатну створити найкоротше рішення, а найкоротше рішення на кожній мові.

Таблиця лідерів



1
Як ви вирішили, що повторення за 13 - це 76923, а не 769230?
aditsu кинути, тому що SE - EVIL

@aditsu Тому що 1/13це 0.076923076923...не так0.769230769230...
Leaky Nun

3
Відверто заявляючи, що ви ніколи не приймете відповіді, це робить цей каталог. Просто нічого не кажіть і ніколи не приймайте відповідь.
Денніс

1
Ви можете додати фрагмент стека, щоб показати найкоротше рішення для кожної мови.
aditsu кинути, тому що SE - EVIL

Відповіді:


5

Java, 150 байт:

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

Додано пробіл:

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

Безголовка, повна програма:

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(;;)було б менше байтів, ніж, while(2<3)хоча, будучи також нескінченним циклом! (І менше байт , ніж while(1)також @Maltysen)
Марв

@Marv Як я міг це забути? Дякую!
Leaky Nun

Поставте декларації для aі rв петлях для. Економить байти!
CalculatorFeline

1
@CatsAreFluffy Це зробило б їх недоступними ...
Leaky Nun

3

CJam, 26

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

Спробуйте в Інтернеті

Пояснення:

Програма будує низку дивідендів, що беруть участь у обчисленні десяткового розширення, поки не знайдуть дивіденд, який він бачив раніше. Потім він бере всі дивіденди, починаючи з того, і ділить їх на n, щоб отримати цифри повторення.

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

3

Python 3.5, 79 74 73 70 байт

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

Збережено 3 байти, відстежуючи дивіденди, ідея, яку я взяв із відповіді CJam @ aditsu .

Перевірте це на repl.it .


2

Желе , 12 10 байт

%³×⁵
1ÇÐḶ:

Збережено 2 байти, відстежуючи дивіденди, ідею, яку я взяв із відповіді CJam @ aditsu .

Спробуйте в Інтернеті!

Як це працює

%³×⁵     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, 152 байти

Виходячи з відповіді Кенні

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}

Я просто знайшов помилку в моєму підході та виправив її, тому, можливо, вам також знадобиться оновити це.
Leaky Nun


1

Perl 6 , 37 байт

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

Якщо вам не байдуже, що він буде працювати лише з знаменниками, які вписуються в 64-бітове ціле число, ви можете видалити виклик методу .FatRat.

Пояснення:

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

Тест:

#! /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 байт

$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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.