십진수 표현의 요점을 찾으십시오!


12

에서 이 도전 2 년 전, 우리가 발견 기간 단위 분수의을 ( 1/n where n is a natural number).

이제 당신의 임무는 단위 분수 의 repetend 를 찾기위한 프로그램 / 함수를 작성하는 것 입니다.

repetend는 같은 무한 반복 소수 확대 부분이다 :

  • 의 진수 표현 1/6되고 0.16666..., 다음 repetend이 있다 6.
  • 의 진수 표현 1/11되고 0.090909..., 다음 repetend입니다 09.
  • 의 진수 표현 1/28되고 0.0357142857142857142857..., 다음 repetend입니다 571428.

명세서

  • 합리적인 형식으로 입력하십시오.
  • repetend를 decimal, string 또는 list로 출력하십시오 .
  • 위해 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의 repetend가 769230이 아닌 076923인지 어떻게 결정합니까?
SE가 EVIL이기 때문에 Aditsu 종료

@aditsu 때문 1/130.076923076923...아닙니다0.769230769230...
Leaky Nun

3
답을 거의 받아들이지 않을 것이라고 공개적으로 언급하면 ​​이것이 카탈로그가됩니다. 아무 말도하지 말고 답을받지 마십시오.
Dennis

1
스택 스 니펫을 추가하여 각 언어에 대한 가장 짧은 솔루션을 표시 할 수 있습니다.
SE가 EVIL이기 때문에 Aditsu 종료

답변:


5

자바, 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;
    }
}

Ungolfed, 전체 프로그램 :

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

@Marv 어떻게 잊어 버렸습니까? 감사!
Leaky Nun

for 루프 arfor 루프에 선언을 넣습니다 . 바이트를 절약합니다!
CalculatorFeline

1
@CatsAreFluffy 그것은 액세스 할 수 없게 만들 것입니다 ...
Leaky Nun

3

CJam, 26

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

온라인으로 사용해보십시오

설명:

이 프로그램은 이전에 본 배당을 찾을 때까지 십진 확장 계산에 관련된 일련의 배당을 구축합니다. 그런 다음 그 배당을 시작하여 n으로 나눠서 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


2

젤리 , 12 10 바이트

%³×⁵
1ÇÐḶ:

@aditsu의 CJam answer에서 얻은 아이디어로 배당금을 추적하여 2 바이트를 절약했습니다 .

온라인으로 사용해보십시오!

작동 원리

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

자바, 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;}

내 CJam 솔루션과 유사합니다.


1

펄 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));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.