我们正在执行以下编程练习: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));
}
}
但是,对于较大的输入数字,其执行时间用完了(因此它使测试失败)。
我们如何改进代码以避免嵌套循环?
我们已阅读并自行解决:
答案 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。
这些公式对于大多数输入将非常快(但是对于非常大的输入,您可能希望使用比默认算法快的乘法算法)