기본에서 계승의 마지막 0이 아닌 숫자 2 <= b <= 10. 입력 정수의 순서는

3 개의 양의 정수 n b k를 입력 출력으로 제공하거나 k의 기본 b표현 에서 후행 0 이전의 마지막 숫자를 리턴 하는 프로그램 또는 함수를 작성해야합니다 n!.

n=7 b=5 k=4
factorial(n) is 5040
5040 is 130130 in base 5
the last 4 digits of 130130 before the trailing zeros are 3013
the output is 3013

입력

  • n b k여기서 3 개의 양의 정수 2 <= b <= 10.
  • 입력 정수의 순서는 임의로 선택할 수 있습니다.

산출

  • 정수 또는 정수 목록으로 리턴되거나 출력되는 자릿수 목록.
  • 선행 0은 선택 사항입니다.
  • 귀하의 솔루션은 내 컴퓨터 에서 1 분 이내에 예제 테스트 사례를 해결해야 합니다 (닫기 사례 만 테스트합니다. 평균 이하의 PC가 있습니다).

제출의 정확성을 확인하기 위해 새로운 테스트가 추가되었습니다. (1 분 미만의 런타임 규칙에는 속하지 않습니다.)

입력 => 출력 (앞의 0을 생략하여 선택)

3 10 1  =>  6

7 5 4  =>  3013

3 2 3  =>  11

6 2 10  =>  101101

9 9 6  =>  6127

7 10 4  =>  504

758 9 19  =>  6645002302217537863

158596 8 20  =>  37212476700442254614

359221 2 40  =>  1101111111001100010101100000110001110001

New tests:
----------

9 6 3  =>  144

10 6 3  =>  544

이것은 코드 골프이므로 가장 짧은 항목이 이깁니다.



답변

Dyalog APL , 23 바이트

⌽k↑⌽{⍵↓⍨-⊥⍨0=⍵}b⊥⍣¯1⊢!n

이 프로그램은 계승이 내부 표현 한계를 초과하지 않는 한 작동합니다. Dyalog APL에서으로 한계를 높일 수 있습니다 ⎕FR←1287.

변수 n, b 및 k가 설정되어 있다고 가정 n b k←7 5 4하지만 (예를 들어 , n , bk를 묻는 순서대로), 세 문자를로 바꿉니다 .


답변

매스 매 티카, 57 48 바이트

@ 2012rcampion 덕분에 9 바이트가 절약되었습니다.

IntegerString[#!/#2^#!~IntegerExponent~#2,##2]&


답변

파이썬 198 개 192 181 문자

def F(n,b,k):
 p=5820556928/8**b%8;z=0;e=f=x=1
 while n/p**e:z+=n/p**e;e+=1
 z/=1791568/4**b%4;B=b**(z+k)
 while x<=n:f=f*x%B;x+=1
 s='';f/=b**z
 while f:s=str(f%b)+s;f/=b
 return s

가장 큰 예에서 ~ 23 초 정도로 빠릅니다. 그리고 계승이 없다 (Mathematica!).


답변

Pyth, 26 35 바이트

M?G%GHg/GHH.N>ju%g*GhHT^T+YslNN1T_Y

이것은 3 개의 인수, 숫자, 밑, 자릿수의 함수입니다.

데모.

가장 느린 테스트 케이스 인 마지막 케이스는 내 컴퓨터에서 15 초가 걸립니다.


답변

PARI / GP, 43 바이트

우주 거래 속도는 다음과 같은 간단한 알고리즘을 제공합니다.

(n,b,k)->digits(n!/b^valuation(n!,b)%b^k,b)

각 테스트 사례는 내 컴퓨터에서 1 초 이내에 실행됩니다.


답변

Mathematica-48 바이트

#!~IntegerDigits~#2/.{l__,0...}:>{l}~PadLeft~#3&

언 골프 드 :

Function[{n, b, k},
  IntegerDigits[n!, b] (* list of the base-b digits in n! *)
  /. {l__, 0...} (* match a sequence of elements l and some number of zeros*)
                 (* lucky for me, __ defaults to match the shortest number *)
     :> PadLeft[List[l], k] (* pad l to be k elements long with zeros on the left *)
                            (* this truncates the list if it is too long*)
]

예:

#!~IntegerDigits~#2/.{l__,0...}:>{l}~PadLeft~#3 &
%[758, 9, 19] // Timing

(* {0.031250, {6, 6, 4, 5, 0, 0, 2, 3, 0, 2, 2, 1, 7, 5, 3, 7, 8, 6, 3}} *)

가장 큰 경우 제한 요소는 숫자를 생성하지 않습니다.

Length@IntegerDigits[359221!, 2] // Timing
(* {0.109375, 6111013} 6.1M digits in 100 ms *)

패턴 일치는로 보이며 O(n^2)마지막 두 테스트 사례가 1 분을 훨씬 초과합니다.


답변

Bash / coreutils / dc, 60 바이트

dc<<<"1 `seq -f%g* $1`$2op"|sed -r s/0+$//|tail -c$(($3+1))

내 대답dc스크립트를 사용하여 후행 0을 자르고 마지막 자릿수 를 선택하고 base 에서 출력 하는 계승을 찾습니다 .$2sedtail$3