求第一个有500个除数因子的三角数,具体题目见原文:

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

Let us list the factors of the first seven triangle numbers:

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

We can see that 28 is the first triangle number to have over five divisors.

What is the value of the first triangle number to have over five hundred divisors?

思想:

1、迭代每个三角数检查因子的数目

2、一个数如果平方根不是整数,那么从1到他的平方根,找到一个因子相当于找到2个因子,可以减少一半计算

3、一个数的平方根是整数,那么平方根是他的一个因子

代码:

private static long hdt(int N) {
        long result = 1;
        for (int k = 2; numOfDivisor(result) < N; result += k, k += 1)
            ;
        return result;
    }

    private static int numOfDivisor(long n) {
        if (n < 3)
            return (int) n;
        int num = 1;
        int i;
        for (i = 2; i * i < n; i += 1) {
            if (n % i == 0) {
                num++;
//                System.out.print(i + " ");
            }
        }
        num *= 2;
        if (i * i == n) {
            num++;
//            System.out.print(i);
        }
//        System.out.println();
        return num;
    }

官网给出了两种优化了很多的解法:

第二种解法没看懂,英文不是很好也有些关系,囧~

第一种解法也有趣,一个数的因子个数等于他的质数因子的(指数+1)的乘积

比如说28=2*2*7,那么28的因子数即为(2+1)*(1+1) = 6,

很有趣的结论,不过没有真名,而且要维持一个素数数组

如果下次还要用到素数,我打算做一个txt文件保存素数表好了。。。