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

标签 java algorithm runtime modulo

我目前遇到 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};

最佳答案

您可以加快代码的速度,使其只查找第一个 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;

关于java - 需要削减给定数字的运行时查找除数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917477/

相关文章:

java - 计算并打印排序数组中的三胞胎

javascript - 只使用一个循环来生成嵌套数组

netbeans - 动态生成复选框,Netbeans

java - 未抛出 ClosedByInterruptException

java - 如何使用 SOAP UI 生成的代码进行 SOAP 调用?

简化债务加权有向图的算法

django - 在运行时更改 Django 设置

java - 是否可以在运行时更改 UI 并将更改保存在 android 应用程序中?

java - 如何将自定义对象的 ArrayList 传递给新 Activity ?

java - android sqlite没有这样的表