gpt4 book ai didi

java - 如何写出更优雅的代码? (阶乘、BigDecimals、除以 BigIntegers)

转载 作者:行者123 更新时间:2023-12-02 13:28:13 24 4
gpt4 key购买 nike

我已经设法使我的代码正常工作,但感觉有更好的方法来编写类似的东西,有什么提示或错误需要指出吗?

这是我的代码:

  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

最佳答案

我看到了以下改进:

  • 您可以从 fact 的值开始,将乘法次数从 O(n^3) 减少到 O(n^2) code> 来自上一次迭代,并且仅与 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;
}
}

关于java - 如何写出更优雅的代码? (阶乘、BigDecimals、除以 BigIntegers),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com