[STARCRAFT] 소수점 범위에서 오차 생길 만한 부분이 있나요?

  • 5tarbuck5
    5tarbuck5

    여러 테스트케이스를 넣어 디버깅 해 봤지만 오답으로 뜹니다.
    큰 오차가 생길 만한 부분을 만들었는지..
    고수님들 도움 부탁드려요!!
    https://algospot.com/judge/problem/read/STARCRAFT

    제가 생각한 방법은 대략 이렇습니다.

    만약 k = 3이고 q = 100 - p이면,

    답: 2C0*p3*q0 + 3C1*p3*q1 + 4C2*p3*q2

    #include <stdio.h>
    #include <math.h>
    
    int Cfunc(int a, int b) {
        if (b == 0 || a == b) return 1;
    
        int rslt = 1, i;
    
        for (i = 0; i < b; i++)
            rslt *= a--;
    
        for (i = b; i > 0; i--) 
            rslt /= i;
    
        return rslt;
    }
    
    int main() {
        int tc, k, j, rslt;
        long double p, q, mid, fin, PP;
    
        scanf("%d", &tc);
    
        while (tc--) {
            scanf("%lf %d", &p, &k);
    
            p *= 0.01;
            q = 1.0 - p;
            PP = pow(p, (double)k);
            mid = 1; fin = 0;
    
            for (j = k - 1; j <= (2 * k) - 2; j++) {
                mid = Cfunc(j, j - k + 1) * PP;
    
                if (j - k + 1) 
                    mid *= pow(q, (double)(j - k + 1));
    
                fin += mid;
            }
    
            fin *= 100;
            rslt = (int)floor(fin + 0.5);
            printf("%d\n", rslt);
        }
        return 0;
    }
    

    8년 전
1개의 댓글이 있습니다.
  • JongMan
    JongMan

    Cfunc()함수가 큰 n에 대해 잘못된 답을 반환합니다.


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.