문제

GMP를 사용하여 매우 큰 계승을 계산합니다 (예 : 234234!). 계산을하기 전에 결과가 몇 자리 길이가 될 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

그만큼 계승의 로그 계승 번호가 취할 숫자 수를 계산하는 데 사용할 수 있습니다.

logn!

이것은 쉽게 알고리즘 형태로 번역 될 수 있습니다.

//Pseudo-code
function factorialDigits (n) 
  var result = 0;

  for(i = 1; i<=n; i++)
    result += log10(n);

  return result;

다른 팁

당신은 변환 할 수 있습니다 스털링의 근사 간단한 로그 수학을 사용하는 공식을 사용하여 숫자 수를 얻습니다.

n!         ~ sqr(2*pi*n) * (n/e)^n
log10(n!)  ~ log10(2*pi*n)/2 + n*log10(n/e)

하드웨어 플로트 수학은 이것에 충분하기 때문에 번개가 빠릅니다.

스털링의 근사치는 n 크기의 근사치를 제공합니다!

alt text

참조 위키 백과 파생에 대한 페이지.

그럴 것입니다

nlog(n) - n + log(n(1 + 4n(1 + 2n)))/6 + log(pi)/2

주제 "성장률" @ 참조 http://en.wikipedia.org/wiki/factorialSrinivasa Ramanujan 방법

예, 참조하십시오 스털링 근사치

그것은 n이라고 말한다! ~ = sqrt (2*piN)(n/e)^n. 숫자 수를 얻으려면 1+log (n!)/log (10)를 가져갑니다.

약 4 명이 스털링을 언급 했으므로 ... 또 다른 옵션은 첫 번째 N 팩토리 노인 각각에 대한 숫자 수를 저장하는 LUT입니다. 정수의 4 바이트와 숫자 수에 대해 4 바이트를 가정하면 처음 1,000,000 개의 요인을 약 8MB에 저장할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top