需要削减给定数字的运行时查找除数

Need to cut runtime finding divisor of given number

我目前遇到 HackerRank 问题的时间限制问题,问题状态是对给定数字的所有奇数除数求和。这是我的代码:

int[] numbers = {21, 11, 7};

    long total = 0;
    for (int i = 0; i < numbers.length; i++) {
        for (int j = 1; j <= numbers[i]; j+=2) {
            if (numbers[i] % j == 0) {
                total += (long) j;
            }
        }
    }

int[] numbers 是可变的,可以包含数千个数字。感谢您的帮助。

int[] numbers = {
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7,
        21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7, 21, 11, 7};

减少运行时间的一种方法是仅迭代到您当前为其寻找奇数的数字的 1/2。它看起来像这样:

for (int j = 1; j <= numbers[i]/2; j+=2) {
    if (numbers[i] % j == 0) {
        total += (long) j;
    }
}

你不需要检查超过这个中点的数字,因为超过这个数字的数字不能是那个数字的约数。

您可以加​​快代码速度以仅查找前 sqrt(n) 个数字的除数。请注意,如果我除以 N,您还会得到 N/i 作为除数的另一部分,并且您需要检查的最大 i 是 sqrt(n).

示例代码:

int sum = 0;
for(int n : all the numbers){
    for(int i = 1; i*i<=n;i++){
        if(n%i == 0){
            if(i % 2 == 1)sum+=i;
            if((n/i) % 2 == 1)sum += (n/i);
        }
    }
}
return sum;