2015-01-10 4 views
-3
public static int fact(int x) { 
    int y = x; 
    for (int i = x - 1; i > 0; i--) { 
     y = y * i; 
    } 
    return y; 
} 

계승을 찾는 재귀 적 방법을 시도했지만 두 방법 모두 3057 또는 임의의 높은 값을 갖는 숫자와 같은 숫자에 대해 0을 제공합니다.Factorial 논리가 응답을 제공하지 않음

+2

그래, 정수 오버 플로우. 32 비트는 * 모든 것에 충분하지 않습니다 ... * –

답변

2

int 대신 long을 사용해보세요. 당신은 아마 정수를 오버런하고있을 것입니다. 그래도 작동하지 않으면 큰 크기를 허용하는 BigInteger으로 전환해야합니다.

편집 편집 해 주셔서 감사합니다.이 번호는 조금 피곤합니다. BigInteger의 기반 아래 코드는 3057.

public static BigInteger fact(int x){ 
    BigInteger y = BigInteger.valueOf(x); 
    for(int i=x-1;i>0;i--){ 
     y = y.multiply(BigInteger.valueOf(i)); 
    } 
    return y; 
} 

의 입력에 근무 또는 당신은 BigDecimal 약간 덜 투박한 사용할 수 있습니다

public static BigDecimal fact(int x){ 
    BigDecimal y = new BigDecimal(x); 
    for(int i=x-1;i>0;i--){ 
     y = y.multiply(new BigDecimal(i)); 
    } 
    return y; 
} 
+0

왜 BigDecimal은 덜 "clunky"하다고 생각합니까? 또한 "계승"은 음수가 아닌 "정수"로 정의됩니다. –

+0

전체 구현을 제공하려하지 않고 BigDecimal 및 BigInteger의 작동 방식을 보여줍니다. 그는 나머지 자신의 코드를 작성할 수 있습니다. ;) "clunky"에 대해서는'새로운 BigDecimal (x)'가'BigInteger.valueOf (x)'(개인 의견)보다 덜 복잡하다고 생각합니다. – Todd