Java 项目12-优化

Java 项目12-优化,java,Java,我正在工作。有没有人能提供一些建议,如何改进我的代码,使其在我的一生中执行 public class HighlyDivisibleTriangularNumber { public static void main(String[] args) { int divisors = 0; int count = 1; while(divisors <= 501) { long triNum = triangularNumber(count);

我正在工作。有没有人能提供一些建议,如何改进我的代码,使其在我的一生中执行

public class HighlyDivisibleTriangularNumber {

public static void main(String[] args) {
    int divisors = 0;
    int count = 1;
    while(divisors <= 501) {
        long triNum = triangularNumber(count);
        divisors = getFactors(triNum);
        System.out.println(triNum+"_"+divisors);
        count++;
    }
}

private static int getFactors(long triNum) {
    int divisors = 0;
    while(triNum > 1) {
        triNum = triNum / 2;
        divisors++;
    }
    return divisors;
}

private static long triangularNumber(int i) {
    long total = 0;
    for(int k = 1; k <= i; k++) {
        total += k;
    }
    return total;
}
}
public类高整除数{
公共静态void main(字符串[]args){
整数除数=0;
整数计数=1;
while(除数1){
triNum=triNum/2;
除数++;
}
返回因子;
}
专用静态长三角形编号(int i){
长总计=0;

对于(int k=1;k为什么每次都要重新计算三元数?每次只需添加差值(基本上是您的计数)

但是12的除数是

1, 2, 3, 4 (= 2*2), 6 (= 2*3), 12
因此,总共有6个12的除数,而不是3,这仅仅是素因子分解可能会让你相信。

1)三角数

你能做的第一个(可能也是最重要的)优化就是如何计算三角形数

可以观察到第n个三角形数(我们称之为t(n))等于n+t(n-1)。 因此,每次计算三角形数时,只需将三角形数加在前面,然后加上n。这将导致简单的递归函数:

private static long triangularNumber(int i) {
    if(i == 1) return 1;
    else return i+triangularNumber(i-1);
}
但这并不会大大提高性能……为了解决这个问题,我建议你做一些关于记忆的研究,并调整我给你的功能(我不会给你答案,这是一个很好的练习)

现在,在普通电脑上,你应该在合理的时间内找到问题的答案,但它可以改进一点

2)计算除数

你计算除数的函数是错误的。你应该试着用连续的自然数除以你的数,看看结果是否是一个自然整数

private static int getFactors(long triNum) {
    int divisors = 0;
    for(int i = 1; i <= triNum; ++i) {
        if(triNum%i == 0) // triNum is a multiple of 1 <=> i is a divisor of triNum
          divisors++;
    }
    return divisors;
}
private static int getFactors(长triNum){
整数除数=0;

对于(int i=1;我应该在……1:为什么每次都要重新计算
triNum
.2:你没有真正测试因子的数量。你只需搜索2的一次幂大于你的数字。这部分应该完全重写。我将在while循环外声明triNum-但我可能仍然需要在循环中不断重新分配它,以便在满足终止条件时,我将知道va是什么三角形数的lue是。Edit:我看到了你的答案,现在明白你的意思了。谢谢。这个问题似乎离题了,因为它要求代码检查。三角形数n,T(n)的非递归公式是:n*(n+1)/2
private static long triangularNumber(int i) {
    if(i == 1) return 1;
    else return i+triangularNumber(i-1);
}
private static int getFactors(long triNum) {
    int divisors = 0;
    for(int i = 1; i <= triNum; ++i) {
        if(triNum%i == 0) // triNum is a multiple of 1 <=> i is a divisor of triNum
          divisors++;
    }
    return divisors;
}