查找Phony Numbers的所有因素

时间:2014-09-04 14:40:23

标签: java algorithm runtime factors

我正在努力寻找最快的全因子算法。我使用所有因子加入arraylist进行添加,并将总和与原始数字进行比较,以确定它们是否相同。

例子。如果加1 + 2 + 3 = 6,则6的因子为[1,2,3}。

除了现在的程序之外,还有更快的分解,添加和比较方法吗?

public class Phony_Number {

private int number;

public Phony_Number(int num) {
    number = num;
    print();
}

public Phony_Number() {
    number = 0;
}

private ArrayList<Integer> factoring(int num) {
    ArrayList<Integer> factors = new ArrayList<Integer>();
    if (num % 2 == 0) {
        for (int ff = 3; ff < num; ff++) {
            if (num % ff == 0) {
                factors.add(ff);
            }
        }
    }
    return factors;
}

private int sum(ArrayList<Integer> array) {
    int sum = 0;
    for (int i = 0; i < array.size(); i++) {
        sum = +sum + array.get(i);
    }
    return sum+3;
}

private boolean compare(int num, int sum) {
    if (num == sum)
        return true;
    return false;
}

public void print() {
    for (int i = number; i > 5; i--) {
        if (compare(i, sum(factoring(i)))) {
            System.out.println("Number " + i + " is phony number");
        }
    }
}

}

My current result for 20,000 numbers is this

Number 8128 is phony number

Number 496 is phony number

Number 28 is phony number

Number 6 is phony number

Nano RunTime 359624716

3 个答案:

答案 0 :(得分:1)

一些小事情跳了出来:你的比较方法没有意义,删除它会稍微简化你的代码。 sum方法只能使用+ =。为什么循环遍历每个数字然后丢弃其中的一半,只需在循环上使用 - = 2。

您的主要保存可以来自factoring方法 - 您知道num/2以上的数字不是因素,所以您可以在到达那里时立即停止。

(事实上,在这种情况下,当您跳过2时,您可以在num/3停留。

答案 1 :(得分:1)

正如你所经历的那样,我相信你也可以通过分工获得辅助因素。例如:

if (num % ff == 0) 
{
   factors.add(num/ff)
   factors.add(ff);
}

但是你必须考虑已经添加它们,所以如果从长远来看它有帮助我就不会有积极作用。

你也可以使用:

return num == sum

答案 2 :(得分:1)

num的除数ff成对出现,即如果ff是除数,则ff和num / ff都是除数。此外,除非ff * ff == num,否则该对中的除数是不同的。因此,您将循环条件更改为ff * ff&lt; = num,然后如果ff除以num,则将ff添加到因子列表,如果ff * ff!= num,则添加num / ff。这将使您的程序以num time的平方根运行,而不是num time。