我正在努力寻找最快的全因子算法。我使用所有因子加入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
答案 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。