歐拉工程第12題 第一個擁有超過500個約數的三角形數是多少

題目

三角形數序列是由對自然數的連加構造而成的。所以第七個三角形數是1+2+3+4+5+6+7=28 . 那麼三角形數序列中的前十個是:

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

下面我們列出前七個三角形數的約數:
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
可以看出28是第一個擁有超過5個約數的三角形數。
那麼第一個擁有超過500個約數的三角形數是多少?

解題方法

第n個三角形數實質上就是等差數列{an=n }的前n項和Sn

Sn=n(n+1)2

任何一個正整數都可以表示成幾個素數的次方的乘積

假設Pn 表示第n個素數,那麼任意正整數可以通過下面的式子獲得:

Num=Pk11Pk22Pk33Pknn,nN+knN

而一個正整數擁有的約數個數爲:

divisor=(k1+1)(k2+1)(kn+1)

程序

程序中用到的Prime類是我自定義的工具類,因爲在做歐拉工程的題目遇到很多素數相關的題目,所以我實現了一個Prime工具類,方便解題。具體的源碼以及用法參考我的另一篇文章——《Java工具類 素數類》

public static void solve() {
    int[] primeArray = Prime.getPrimeArrayByLength(2000);
    int num = 0;
    for (int i = 1;; i++) {
        // Sn的值
        num += i;
        int temp = num;
        // Sn擁有的約數個數
        int divisor = 1;
        int j = 0;
        for (; temp != 1; j++) {
            int count = 0;
            // 求kn的值
            while (temp % primeArray[j] == 0) {
                temp /= primeArray[j];
                count++;
            }
            divisor *= count + 1;
        }

        if (divisor > 500) {
            System.out.println("num " + num + " is first num whose divisors over 500(" + divisor + ")");
            break;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章