我只需要一些关于改进问题解决方案的建议。请不要把解决方案交给我,因为我想自己完成。这是我尝试使用递归解决Project Euler Prob 12。问题是要求第一个三角形数字超过500个除数。
我没有看到任何错误; Eclipse也不会显示任何错误。它只是继续运行而没有得到答案。
public class P012 {
public static void main(String[] args) {
int m=2;
int c=1;
int d=(c*(c+1)/2);
while (numDivs(d,m)<=499) {
c++;
d=(c*(c+1)/2);
}
System.out.println(d);
}
public static int numDivs(int a, int b) {
int foo=2;
while (b < a/2) {
if ((a%b)==0)
foo++;
b++;
numDivs(a,b);
}
return foo;
}
}
答案 0 :(得分:0)
你正在使用一种非常天真的算法。你应该改进那个。
1)你确定答案适合int
吗?
想一想,做一些测试。
2)你可以,例如使用
的素数分解
计算其除数的数字。如果素数分解是:
M = p1 ^ k1 * p2 ^ k2 * ... pN ^ kN
,
那么M
的除数的计数是:
(k1+1)*(k2+1)*...*(kN+1)
。
3)您可能需要筛选所有素数,直至给定的预选值 (例如,高达10,000,000)以便更快地实施2)。
4)即使采用这种天真的方法,我也不认为你的方法是什么 在逻辑上是正确的,即首先在几个小数字上进行测试。
另见:
答案 1 :(得分:0)
我只是自己计算了这个问题,我可以说你的方法大部分都有效。这个数字并不像我在开始时所假设的那么大。最大的问题是numDivs中的unnessecary递归调用。只需用while循环计算它(在这种情况下你也只需要一个函数参数)。然后它需要大约一两分钟才能运行(你需要计算超过12000个三角形数字,这并不是那么糟糕)。你的numDivs有一个错误,你应该在b <= a / 2时打破你的while循环(或者在某些情况下你不计算一个因子)。通过这些修复,您的方法应该有效。祝你好运。
编辑:通过我提到的修复,我尝试了你的程序 - 它与我的结果相同,所以你已经发现解决方案只有一些小错误。顺便说一句有趣的数字,由此产生的数字。 : - )答案 2 :(得分:0)
查看你对numDivs()的递归调用。这计算了其参数指示的除数的数量并返回了该值。你对返回的值做了什么?那真的你想用它做什么?
另一个单独的提示。您的循环限制为/ 2太高。你可以减少它。