ProjectEuler 12

来源:互联网 发布:大学生书单 知乎 编辑:程序博客网 时间:2024/05/02 08:17

求第一个有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文件保存素数表好了。。。

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击