2017-04-09 6 views
0

필자는 코드 작동을 관리해 왔지만 유사한 내용을 작성하는 데있어 더 나은 접근법이나 팁이나 실수를 지적했습니다. 나는 다음과 같은 개선 사항을 참조더 우아하게 코드를 작성하는 방법은 무엇입니까? (Factorials, BigDecimals, BigIntegers로 나누기)

public static void main(String[] args) { 
     DecimalFormat df = new DecimalFormat("0.##E0"); 
     BigDecimal a; 
     BigInteger fact; 
     int n=10; 
     int x=3; 

     for (int i=1; i<=n; i++){ 
      fact=BigInteger.valueOf(1); 
      for (int j=1; j<=Math.pow(i,2)+1; j++){ 
      fact=fact.multiply(BigInteger.valueOf(j)); 
      } 
     a=BigDecimal.valueOf((Math.pow(-1, i+1)*Math.log(i*x))/i).divide(new BigDecimal(fact), 500, BigDecimal.ROUND_HALF_EVEN); 
     System.out.println(df.format(a)); 
     } 
    } 

Was calculating these numbers

+4

나는이 http://codereview.stackexchange.com/ – Koekje

+0

에 속한 생각 예. 이 코드에 관해 말할 수있는 대부분의 것들은 "의견"에 근거한 대답을 요구하는 질문을하게 만드는 "스타일"문제입니다. –

+1

또 다른 대답은 Java 언어 구문 사용과 관련하여 실질적으로 "더 나은 방법"이 없다는 것입니다. (하지만 이것 역시 의견입니다.) –

답변

1

: 여기

내 코드의

당신은 fact의 값으로 시작하여 O(n^3)에서 O(n^2)에 곱셈의 수를 줄일 수
    • 이전 반복에서 제외하고 j에 대한 누락 된 값만 사용하십시오.
    • 의견에서 언급했듯이 Math.pow(i,2)은 잔인합니다. Math.pow(-1,i+1)에 대해서도 동일합니다.

    함께이주는 약간의 변경 사용 BigDecimal.ONE :

    public static void main(String[] args) { 
        DecimalFormat df = new DecimalFormat("0.##E0"); 
        int n = 10; 
        int x = 3; 
        int scale = 500; 
    
        BigInteger fact = BigInteger.ONE; 
        int rangeEndPrev = 0; 
        int sign = 1; 
        for (int i = 1; i <= n; i++) 
        { 
        int rangeEnd = i*i + 1; 
        for (int j = rangeEndPrev + 1; j <= rangeEnd; j++) 
         fact = fact.multiply(BigInteger.valueOf(j)); 
        BigDecimal a1 = BigDecimal.valueOf((sign * Math.log(i * x))/i); 
        BigDecimal a = a1.divide(new BigDecimal(fact), scale, BigDecimal.ROUND_HALF_EVEN); 
        System.out.println(df.format(a)); 
        rangeEndPrev = rangeEnd; 
        sign = -sign; 
        } 
    }