2012-05-04 3 views
1

Cpp를 사용하여 계승에서 0의 수를 찾고 싶습니다. 문제는 내가 정말로 큰 숫자를 사용할 때이다.정말 긴 숫자의 계수 (fmod)

#include <stdio.h> 
#include <math.h> 

long zeroesInFact(long n) 
{ 
long double fact=1; 
long double denominator=10.00; 
long double zero=0.0000; 
long z=0; 
printf("Strating loop with n %ld\n",n); 
for(int i=2;i<=n;i++) 
{ 
    fact=fact*i; 
    printf("Looping with fact %LF\n",fact); 
} 
printf("Fmod %lf %d\n",fmod(fact,denominator),(fmod(fact,denominator)==zero)); 
while(fmod(fact,denominator)==zero) 
{ 
    fact=fact/10; 
    z++; 
} 
printf("Number of zeroes is %ld\n",z); 
return z; 
} 

int main() 
{ 
long n; 
long x; 
scanf("%ld",&n); 
for(int i=0;i<n;i++) 
{ 
    scanf("%ld",&x); 
    printf("Calling func\n"); 
    zeroesInFact(x); 
} 
return 0; 
} 

나는 여기에 문제가

FMOD (사실, 분모) 는 (0.000 인) 10.00로 나에게 22의 계승와 분모에 대한 정확한 답을 준다라고 생각합니다. 그러나 그것은 나에게 숫자 정밀도로 첫 번째 교훈을 10.00

+2

힌트 : 제품에서 제로의 수는'5's와 피승수의 주요 요인의 목록에'2's의 수와 관련이있다. –

+1

전혀 아닙니다. 11^5 = 161051. OP가 그가 말한 "0의 수"에 관심이 있는지, 아니면 "TRAILING 0의 수"를 정말로 원한다면 명확하지 않다. 그의 코드에서 그는 두 번째를 원하는 것처럼 보입니다. – fjardon

+0

[관련 토론] (http://stackoverflow.com/q/2847069/312172)이 흥미로울 수 있습니다. –

답변

3

로 (23)의 계승와 분모에 대한 잘못된 답을 고려해 제공합니다. float, doublelong double 유형은 정확한 값이 아닌 근사값을 저장하므로 일반적으로 이러한 계산 방식에 적합하지 않습니다. 정답에 대한 정밀도가 충분하더라도 보통 int64_tuint64_t과 같이 정수형을 사용하는 것이 좋습니다. 때로는 심지어 128 비트 정수형을 사용할 수도 있습니다.

솔직히, 난 당신이 22! 통해 18!에 대한 올바른 답을 얻을 운이 생각하는 (예를 들어 __int128는 마이크로 소프트 비주얼 스튜디오와 함께 사용할 수 있습니다).

long double이 플랫폼에서 4 배 정밀도이면 최대 30!까지 계산할 수 있어야한다고 생각합니다. fmod - fmodl을 사용했을 때 실수를했습니다.


두 번째로 중요한 점은 기본 데이터 유형이 충분하지 않다는 것입니다. 자신 만의 데이터 유형을 작성할 수는 있지만 기존 솔루션을 사용하는 것이 더 나을 것입니다. Gnu Multiple Precision GMP (수학 라이브러리)는 C/C++에서 사용할 수있는 빠르고 효율적인 라이브러리입니다.

또는 언어를 전환 할 수 있습니다 (예 : python 정수 데이터 유형은 임의의 정밀도 (GMP만큼 빠름)가 아니므로 특별한 작업을 수행 할 필요가 없습니다. Java는 이러한 계산을 수행하는 클래스가 BigInteger입니다.


세 번째 단원은 정확하지 않은 방법을 찾는 것입니다. 실제로 후행 0의 수를 찾기 위해 23!을 계산할 필요는 없습니다. 주의 깊게 계산을 구성하여 필요하지 않은 추가 정밀도를 삭제할 수 있습니다. 또는 Rob이 주석에서 언급 한 것과 같이 완전히 다른 번호를 얻는 방법으로 전환 할 수 있습니다.

+0

수업을 잘 배웠습니다. 감사합니다 :) 나는 계승에 5의 숫자가 필요하다는 것을 깨달았습니다. –