项目Euler 12,Java解决方案尝试,递归错误?

时间:2014-12-15 14:54:28

标签: java recursion

我只需要一些关于改进问题解决方案的建议。请不要把解决方案交给我,因为我想自己完成。这是我尝试使用递归解决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;

    }
}

3 个答案:

答案 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)即使采用这种天真的方法,我也不认为你的方法是什么 在逻辑上是正确的,即首先在几个小数字上进行测试。

另见:

http://en.wikipedia.org/wiki/Divisor_function

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 1 :(得分:0)

我只是自己计算了这个问题,我可以说你的方法大部分都有效。这个数字并不像我在开始时所假设的那么大。最大的问题是numDivs中的unnessecary递归调用。只需用while循环计算它(在这种情况下你也只需要一个函数参数)。然后它需要大约一两分钟才能运行(你需要计算超过12000个三角形数字,这并不是那么糟糕)。你的numDivs有一个错误,你应该在b <= a / 2时打破你的while循环(或者在某些情况下你不计算一个因子)。通过这些修复,您的方法应该有效。祝你好运。

编辑:通过我提到的修复,我尝试了你的程序 - 它与我的结果相同,所以你已经发现解决方案只有一些小错误。顺便说一句有趣的数字,由此产生的数字。 : - )

答案 2 :(得分:0)

查看你对numDivs()的递归调用。这计算了其参数指示的除数的数量并返回了该值。你对返回的值做了什么?那真的你想用它做什么?

另一个单独的提示。您的循环限制为/ 2太高。你可以减少它。