종료, 순수 ​​정기 또는 최종 정기?


21

소개

소수점 이하 자릿수가있는 경우 소수점이 종료됩니다. 예를 들어, 0.4 (2/5)는 십진수가 하나이므로 종료됩니다.

소수점 이하 자릿수는 무한하며 소수 자릿수 (반복되는 소수 자릿수) 앞에 10 진수가없는 경우 10 진수는 완전히주기적인 것입니다. 예를 들어 0.142857142857142… 142857은 소수점 직후 반복되기 시작합니다.

소수점 이하 자릿수가 무한대이고 반복되기 전에 소수점 이하 자릿수가 유한 숫자 인 경우 10 진수는 결국 주기적입니다 (예 : 0.166666666666666… (1/6) repetend 6은 1 후에 반복되기 시작합니다.

당신의 작업

주어진 숫자 pq (정수, 0 <= p < q <= 100)가 p / q 의 10 진수 표시 가 종료, 순주기 또는 최종주기 인지 결정 하는 프로그램이나 함수를 작성 하십시오 .

당신은해야 출력 a그것의 종단 경우 (예 : 0.1), b그것은 순전히주기 인 경우 (즉, 0.333 ...), 또는 c그것이 결국주기 인 경우 (즉, 0.166 ...), 어디에서 a, b그리고 c당신의 선택의 어떤 별개의 일정 문자열입니다.

테스트 사례

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

모든 테스트 사례는 여기에서 찾을 수 있습니다 .

출력에 대해 3 가지 값을 선택할 수 있지만 어느 값인지 명확해야합니다.

이것은 이므로 바이트 수가 가장 적은 코드가 이깁니다.

힌트

종료 :

가장 간단한 형태의 종료 소수점 분모의 소인수 분해는 2와 5로만 구성됩니다.

순전히주기적인 :

가장 간단한 형태의 순수 주기적 소수 분모의 소인수 분해에는 2 또는 5가 포함되지 않습니다.

결국 주기적으로 :

가장 간단한 형태의 최종주기 소수점 분모의 소인수 분해에는 적어도 하나의 2 또는 5가 포함되지만 다른 숫자도 포함됩니다.

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

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



2
그것이 실제로 중복 이라고 생각한다면 , 나는 가까운 투표를했을 것입니다. " 거의 " 이라는 단어를 사용한 이유가 있습니다.
Peter Taylor

1
p / q 형식으로 분수가 주어 졌을 때 어떻게 주어진가? 분자와 분모를 별도의 함수 인수로 사용할 수 있습니까?
Dennis

2
종료하기에 잘못된 것, 순전히주기적인 것, 결국주기적인 것보다 1을 초과하는 것과 같은 특정 조건을 충족시키는 일정하지 않은 값을 출력 할 수 있습니까?
ETHproductions

1
아니오, 1/13은 순차가 '076923'이므로 순수주기입니다. Repetent와 함께 0이 반복됩니다.
Oliver Ni

답변:


8

젤리 , 10 바이트

:gÆfḍ⁵ṢQ¬Ḅ

분모와 분자 (순서대로)를 인수로 받아들입니다. 종료하는 경우 0 , 순전히주기적인 경우 1 , 결국주기적인 경우 2 를 반환 합니다. 온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

: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.

11

자바 스크립트 (ES6), 70 .. 68 53 바이트

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

종료하는 경우 0 을, 순수하게주기적인 경우 true 를 , 결국주기적인 경우에는 false 를 반환 합니다.

작동 원리

우리가 여기서하는 일은 실제로 손으로 나눗셈을 시뮬레이션하는 것입니다.

  1. a?...:0-분자가 0이면 여기서 멈추고를 반환 0합니다. 시퀀스가 종료됩니다 .
  2. (s[a]^=a)?...:x==a-우리가 이미이 분자를 만난 적이 있다면 그것은 시퀀스가 ​​주기적이며 영원히 반복 될 것임을 의미합니다. 우리는 여기서 중지하거나 반환 true하는 경우 aIS는 첫 번째 값에 동일 x(순서의 순수주기 ) 또는 false그렇지 않은 경우 ( 결국 정기 ).
  3. f(a*10%b,b,s,x||a)-그렇지 않으면 분자 a에 10을 곱합니다 . 나머지 분모를 분모 로 계산합니다 b. 그리고 우리는이 나머지를 새로운 분자로 사용하여 과정을 반복합니다. ( a서열에 아직 저장되어 있지 않은 경우 시퀀스의 첫 번째 값으로 전달 합니다 x.)

  • 파란색 : 분자 = 1
  • 녹색 : 분모 = 7
  • 빨강 : 10 곱하기
  • 블랙 : 나머지
  • 회색 : 몫 자리수 (우리는 실제로 여기에 신경 쓰지 않으며 위 코드는 전혀 계산하지 않습니다)

division


9

파이썬, 62 61 59 바이트

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

인쇄 1 결국주기위한 2 순수주기위한, 그리고 (4) 종단 대.

repl.it 에서 모든 테스트 사례를 확인하십시오 .


매혹적인! 무엇을 *r합니까?
ETHproductions

튜플 r의 압축을 풉니 다 . f(1, *(2, 3), 4)와 같습니다 f(1, 2, 3, 4).
Dennis

따라서 이것은 JS에서 56 바이트입니다.f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

내 나쁜, 63 바이트 (나는 깜빡 in파이썬보다 JS에서 매우 다른 용도로 사용) :f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

@ETHproductions 깔끔한. 나는 f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)잘 작동 할 것 같아요 .
Dennis

6

펄, 49 46 45 바이트

에 +3 포함 -p

Dennis 의 우아한 아이디어를 기반으로 하지만 확실한 방식으로 구현

STDIN에 입력 번호를 줘

terminating.pl <<< "2 26"

termninating.pl:

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

종료하는 경우 2를 인쇄합니다. 주기적인 경우 1, 결국주기적인 경우 아무것도 없음


특정 그룹의 모든 숫자는 동일한 값을 제공해야합니다.
Oliver Ni

@OliverNi 그들은 지금
Ton Hospel

3

배치, 247 바이트

@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

분수에서 정확한 십진수 까지 빠른 gcd10 트릭을 사용합니다 . 분명히 사용자 정의 출력 형식을 사용하여 많은 바이트를 저장할 수 있습니다.


@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E42 바이트 만 저장하면 어떻습니까?
ETHproductions

분명히 사용자 정의 출력 형식을 사용하여 많은 바이트를 저장할 수 있습니다.
Oliver Ni

@ETHproductions 올리버가 인용 한 것처럼 그가 원하지 않는 것 같습니다.
Outgolfer Erik

3

자바 스크립트 (ES6), 91 88 85 79 75 74 78 바이트

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

출력 NaN종료, 1순주기 및 Infinity최종주기를 위한 .

테스트 스 니펫

설명

먼저, 우리 는 분수를 가장 간단한 형태로 줄이기 위해 ndgcd (d, n)로 나눕니다 . 이를 통해 결과가 순수하게 주기적으로 계산되는 2/6 과 같은 상황을 피할 수 있습니다 . 또한 변수 tgcd (d, 10) 로 정의합니다 . 이것은 나중에 사용됩니다.

첫 번째 점검은 n0 인지 또는 d1 인지 여부 입니다. 경우 N 개의 * (D-1) 0, 우리는 반환 +f또는 NaN이 : 분획되어 종료 .

다음 점검은 t1 인지 여부 입니다. 그렇다면 1 을 반환합니다. 합니다. 분수는 완전히 주기적 입니다.

t1아닌 경우 dt로 나누고 전체 함수를 다시 실행 한 다음 0으로 나눕니다. n / (d / t) 가 종료되면 NaN / 0 = NaN을 반환합니다 : 분수가 종료됩니다 . 그렇지 않으면 1/0 = Infinity를 반환 합니다. 분수는 결국 주기적 입니다.


가장 간단한 형태의 축소는 어디에 있습니까?
Ton Hospel 2016 년

@TonHospel 수정되었습니다.
ETHproductions

@Arnauld 무슨 말인지 잘 모르겠습니다. Infinity해당 값을 모두 반환 합니다.
ETHproductions

@Arnauld Aw, 사람, 나는 결코 조정하지 않고 벗어날 수 있다고 생각했습니다 n... 지적 해 주셔서 감사합니다.
ETHproductions

3

수학, 41 바이트

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

{3,1,2}입력에 종료 소수점 확장이 있으면 출력{2,3,1} , 입력은 단순히 주기적 소수점 확장 한 경우 및 {3,2,1}상기 입력주기는 결국 소수 확대 경우.

은밀한 속임수를 기반으로 : d분수의 분모가 가장 낮은 용어 인 경우 최대 공통 제수는 소인수 분해에 2와 5 만있는 경우 d10^d같습니다 . 소인수 분해에서 2s 또는 5s가없는 경우 와 같습니다 . if 에 2s / 5s와 다른 소수가있는 경우 일부 정수와 같습니다 .dd1dd

그만큼 Ordering 함수는 트리플의 가장 작은 요소, 가장 작은 요소 및 가장 큰 요소가 어디에 있는지보고합니다.

결함 : {1,2,3}대신 변형 출력을 반환{3,1,2} 입력이 0 경우 .

Mathematica, 46 바이트, 왜곡

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

a[[1]]입력에 종료 10 진수 확장 b[[1]]이 있고 입력에 순수 주기적 10 진수 확장이 있고 입력에주기적인 10 진수 확장 이있는 경우를 리턴 합니다 b[a]. 모든 경우에 오류가 발생합니다!

위와 같이, 우리는 그 최대 공약수가 1, d 또는 그 사이 어딘가인지 알고 싶습니다. 해당 gcd의 밑이 d 인 로그는 0, 1 또는 그 사이의 값입니다.

이제 우리는 Mathematica를 고문하기 시작합니다. b[a][[n]]식의 n일부를 나타냅니다.b[a] . 따라서 b[a][[1]]반환 a; b[a][[0]]리턴 b; 그리고 b[a][[x]]여기서 x0과 1 사이의 숫자이며, 매스 매 티카는 오류가 발생한다 "부 :: pkspec1 : 표현은 x. 일부 사양으로 사용할 수 없습니다" b[a][[x]]평가되지 않은 상태로 반환합니다 .

이것은 결국주기적인 경우에 대한 출력이이라는 것을 제외하고는 세 가지 경우를 적절히 구분합니다 b[a][[x]]. 이는 x실제의 로그 이기 때문에 일정하지 않습니다 . 그래서 우리는 적용[[1]] 이미 설명한 출력에 합니다. Mathematica가 내부적으로 어떻게 표현되는지 b[a][[x]]에 따라 결과 b[a][[x]][[1]]는 간단 b[a]합니다. 반면에 적용 [[1]]하면 a"Part :: partd : 부품 사양 a [[1]]이 (가) 객체 깊이보다 길다"라는 오류가 발생합니다. 그리고 a[[1]]평가되지 않은 결과를 반환 합니다.b ) .

결함 : 입력 0에 대한 거짓말 b[a] 대신을 합니다 a[[1]].


2

C 173 바이트

stdin에서 정수 2 개를 가져 와서 순수하게주기적인 경우 1을, 결국주기적인 경우 -1을, 종료하는 경우 0을 인쇄합니다.

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

언 골프 드 :

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

반 골프 :

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

2

사실은 15 바이트

이것은 Dennis의 Jelly 답변을 기반으로 합니다. 0 은 종료되고 1 은 순수 주기적이며 2 는 결국 주기적입니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

▼Ny9u♀%SR♂b╔2@¿

언 골핑

      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.

1

매스 매 티카, 44 바이트

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

Null종료, True순수 주기적 및 False최종주기 를 반환 합니다 .

설명

RealDigits

N의 십진 확장을 구합니다 (반복 숫자는 여분의 머리로 묶습니다 List {}).

ListQ@Last@#

소수점 확장의 마지막 요소가입니다 List.

Length@#==1

위의 조건이 True인 경우 전체 소수점 확장이 하나의 항목으로 구성되어 있는지 확인하십시오. (A List는 하나의 엔티티로 계산됩니다). ( True또는 반환 False)

(조건이 FalseNull경우에 대한 세 번째 인수가 없으므로 a 가 반환됩니다. If)


1

Pyth , 31 27 바이트

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

입력

4,12

여기서 시도해 볼 수 있습니다 . 인쇄 1 결국주기위한 2 순수주기위한, 그리고 0 종단 대. 이것이 codegolf에서 처음으로 응답하는 것입니다. 어떤 제안이라도 환영합니다.

설명

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

[2,3]은 [2,5] = [2]로 필터링되지만 [2,3,5]-[2,5] = [3]으로 필터링됩니다.


1

PARI / GP, 64 바이트

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

종료를 위해 아무것도 출력하지 않습니다. 순수하게는 0, 결국 주기적으로는 1을 출력합니다.

별로 화려하지는 않지만 시작했을 때 더 나은 것을 원했습니다.


1

05AB1E , 16 11 바이트

@Adnan 덕분에 5 바이트를 절약했습니다!

¿²r/fTrÖbÙJ

순수주기는 0, 종료는 1, 마지막주기는 10을 인쇄합니다.

설명:

                 # 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

입력은 p 개행 문자 q 로 간주됩니다 .

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


05AB1E :)를 사용해 주셔서 감사합니다. Osabie는 또한 암시 적 입력을 사용하여 처음 두 개를 제거 할 수 있습니다 I. 또한로 미리 정의 된 상수 10T입니다. 동일에 2B,이다 b:).
Adnan

입력 레지스터를 사용 ¿²r/fTrÖbÙJ하여 최종 코드 를 제공 할 수도 있습니다 :).
Adnan

1

PHP, 126 바이트

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

최종적으로 0을 종료하고 순전히주기 2를 1로 인쇄합니다. 분자가 배열에 두 번 있는지 여기에서 설명하겠습니다. 종료되면 주기적 세션을 시작합니다. echo end($a);값을 0 신뢰하지 않으면 $t=count($a)>$d?2:0;루프에 넣으 십시오.

더 명확하게하려면 추가 print_r($a);하거나var_dump($a); 또는 json_encode($a);루프 후

분자가 두 항목 사이의 항목을 두 배로 계산하고주기의 길이를 얻을 수 있고주기가 시작되는 첫 번째 분자에 의해 위치를 볼 수있는 경우 배열의 끝에서 하나의 분자를 두 번 또는 0을 볼 수 있습니다.

그 후 우리는 주기적 시퀀스의 위치와 길이를 찾을 수 있습니다. if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

주기적인 시각화

$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

출력은주기적인 용어를 시각화합니다

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

130 바이트의 다른 방법

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

확장 버전

$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

정확한 소수로 분수를 참고하십시오 .
Neil

@Neil 당신은 다른 질문에 대답하기 위해 코드를 수정해야한다는 것을 의미합니까?
Jörg Hülsermann

글쎄, 나는 다른 질문에 PHP 답변이 없다고 생각했습니다. 아마 당신은 하나를 제공하고 싶습니다.
Neil

@RosLuP 예제 3/53의 경우이 배열이 작성됩니다.[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann

3 / 103 = 0.0291262135922330097087378640776699029126213592233009708 그리고 같은 기간에 같은 숫자 (예 : 00 ~ 00 사이의 숫자 7)가 나타날 수 있습니다. 그러나 당신이 말하는 배열이 숫자가 아닌 {d 배열 = 10 * (d % b)} 여기서 숫자가 d / c 인 것보다 좋습니다. 각주기마다 하나의 값 d_i 만 있습니다 ...
RosLuP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.