2017-04-09 74 views
0

我已經設法讓我的代碼工作,但覺得有更好的方法來編寫類似的東西,任何提示或錯誤指出?如何更優雅地編寫代碼? (Factorial,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; 
    } 
}