2013-03-02 2 views
0

안녕하세요. 내 코드에 다른 문제가있어서 모든 사람이 내 게시물을 편집했습니다. 어제 factorial 함수에 문제가 있었지만 답장으로 문제를 해결했지만 우스운 실수였습니다. . 문제는 이제 15보다 높은 일부 값의 경우 최종 결과 (개별 숫자의 계승이 아닌)가 항상 0 또는 -1 인 경우 더 낮은 값에 대해서는 fine.Can 누군가가이 코드에 무엇이 잘못되었는지 말해 줄 수 있습니다.Factorial이 모든 값에 대해 작동하지 않습니다.

#include <iostream> 
    #include<time.h> 

    using namespace std; 



    int factorial(int a){ 
    if(a==1) 
     return 1; 
    else if(a==0) 
     return 1; 
    else 
     return factorial(a-1)*a; 

    } 

    int main(){ 
    std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    std::cout.precision(5); 
    int n,k; 
    int x,y,z,w,v; 


    cout<<"give n : "; 
    cin>>n; 


    cout<<"give k : "; 
    cin>>k; 

    clock_t t; 

     t = clock(); 



     if(n>=k&&k>1){ 

     x=factorial(n-1); 
     y=factorial(k-1); 
     z=factorial(n-1-k); 
     w=factorial(n-k); 
     v=factorial(k); 


     cout<<"Result is "<<(x/(v*z))+(x/(y*w))<<endl; 
     } 
     else if (n==0||n==k) 
     cout<<"Result is 1"<<endl; 
     else 
     cout<<"Result is 0"<<endl; 


     t = clock() - t; 
     cout<<"It took "<<t<<" clicks ("<<((float)t)/CLOCKS_PER_SEC<<" seconds)"<<endl;  



     return 0; 
     } 
+4

'계승'에 대한 코드를 표시해야합니다. – NPE

+1

그냥 잡았다! - 분 할 때 0으로 나누기 오류가 발생하지 않도록하십시오. 즉, 'v * z'및 'y * w'의 값은 0이 아니어야합니다. '계승'기능을 게시하면 잘못된 점에 대해 더 많은 통찰력을 얻을 수 있습니다. – Tuxdude

+0

음, 어디서 충돌하는지 말하지 않았습니다. 충돌이 발생하면 디버거를 사용하여 현재 상황을 확인하십시오. –

답변

2

정수 오버 플로우.

int이 시스템에서 32 비트 인 경우 표시 할 수있는 최대 값은 2147483647입니다. 13 계승은 6227020800입니다.

long long과 같은 64 비트 정수 유형을 사용하는 경우 최대 20 계승 이동할 수 있습니다.

부동 소수점은 더 많은 범위를 제공하지만 정밀도는 떨어집니다.

큰 factorials를 실제로 계산해야하는 경우 GMP과 같은 다중 정밀도 라이브러리를 사용하거나 내장 된 임의 정밀도 정수 연산이있는 언어를 사용해야합니다 (C 않음).

+0

답해 주셔서 감사합니다 나는 더 많은 것을 독자적으로 공부할 것이고, 내가 코드에서 어떤 것을 바꿀 것인지를 볼 것입니다. 모든 값을 계산할 수 없다는 이유로 불이익을받을 것이라고 생각하지는 않지만 기술적으로 옳습니다. – MKB

1

다음은 제로 또는 음의 인수 factorial를 호출 할 수 있습니다

z=factorial(n-1-k); 
w=factorial(n-k); 

당신은 당신의 factorial 기능은 충돌없이 같은 인수를 처리 할 수 ​​있는지 확인해야합니다 (I은 그렇지 않은 의심).

+0

고마워 다 방금 factorial 함수에서 0의 계승을 잊어 버렸다는 것을 깨달았습니다. 나는 지금까지 올바른 것으로 생각했던 오래된 운동에서 붙여 넣기 때문에 함수를 살펴 보지 않았습니다. – MKB

관련 문제