从大输入值获取所有最小值和最大值的总和

时间:2020-05-01 15:46:32

标签: java algorithm biginteger

我们正在执行以下编程练习:Functions of Integers on Cartesian Plane

任务是编写三个函数以获取x和y之间的所有最小数(所有组合)的总和,另一个函数是求出x和y之间的所有最大数的总和,第三个函数具有x和y的所有总和。以前的那些。

我们写了:

import java.math.BigInteger;

public class Funcij {

    public static BigInteger  sumin /*⬇️*/ (int n) {
        System.out.println("\nsumin n: "+n);
    BigInteger sum = BigInteger.ZERO;
    for(int y=1; y<=n; y++){
      for(int x=1; x<=n; x++){
        sum = sum.add(BigInteger.valueOf(Math.min(x,y)));  
      }
    }
    return sum;
    }
    public static BigInteger  sumax /*⏫*/ (int n) {
        System.out.println("\nsumax n: "+n);
    BigInteger sum = BigInteger.ZERO;
    for(int y=1; y<=n; y++){
      for(int x=1; x<=n; x++){
        sum = sum.add(BigInteger.valueOf(Math.max(x,y)));  
      }
    }
    return sum;
    }

    public static BigInteger  sumsum /*➕*/ (int n) {
        System.out.println("\nsumsum n: "+n);
    return sumin(n).add(sumax(n));
    }
}

但是,对于较大的输入数字,其执行时间用完了(因此它使测试失败)。

我们如何改进代码以避免嵌套循环?

我们已阅读并自行解决:

1 个答案:

答案 0 :(得分:0)

对于sumin:

整数x小于editText.setSelection(start + newText.length()); 范围内的其他n-x个整数。因此,它将为此总和贡献[1, n](+ x,因为我们还将x和x之间的最大值相加)。如果将此表达式的Xs从1到n求和,将得到x * (n - x) + x。最后一个表达式就是sumin。

类似地,对于sumax,每个数字将精确地贡献n*(n+1)*(n+2)/6并将其相加得到x*x,同样,它也将恰好是sumax。

这些公式对于大多数输入将非常快(但是对于非常大的输入,您可能希望使用比默认算法快的乘法算法)

相关问题