Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更优雅地编写代码?(阶乘、大小数、大整数除法)_Java_Math_Biginteger_Bigdecimal_Factorial - Fatal编程技术网

Java 如何更优雅地编写代码?(阶乘、大小数、大整数除法)

Java 如何更优雅地编写代码?(阶乘、大小数、大整数除法),java,math,biginteger,bigdecimal,factorial,Java,Math,Biginteger,Bigdecimal,Factorial,我已经设法使我的代码工作,但感觉有更好的方法来编写类似的东西,有什么提示或错误要指出吗 这是我的密码: public static void main(String[] args) { DecimalFormat df = new DecimalFormat("0.##E0"); BigDecimal a; BigInteger fact; int n=10; int x=3; for (int

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

这是我的密码:

  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));
        }
    }
publicstaticvoidmain(字符串[]args){
DecimalFormat df=新的DecimalFormat(“0.##E0”);
大十进制a;
大整数事实;
int n=10;
int x=3;

对于(int i=1;i我看到以下改进:

  • 通过从上一次迭代中的
    fact
    值开始,只与
    j
    的缺失值相乘,可以将乘法次数从
    O(n^3)
    减少到
    O(n^2)
  • 正如在评论中提到的,
    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;
  }
}
publicstaticvoidmain(字符串[]args){
DecimalFormat df=新的DecimalFormat(“0.##E0”);
int n=10;
int x=3;
int标度=500;
BigInteger事实=BigInteger.1;
int rangeEndPrev=0;
int符号=1;

对于(int i=1;我认为这是肯定的。关于这段代码,我可以说的大多数事情都是“风格”问题,这(可以说)会使这个问题成为一个需要“基于意见”的答案的问题。另一个答案是,在使用Java语言构造方面,没有实质上“更好的方法”(但这也是一种意见)有一点吹毛求疵:
i*i
可能比
Math.pow(i,2)
更快更简单。