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 , b 및 k를 묻는 순서대로), 세 문자를로 바꿉니다 ⎕
.
답변
매스 매 티카, 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 에서 출력 하는 계승을 찾습니다 .$2
sed
tail
$3