題目
三角形數序列是由對自然數的連加構造而成的。所以第七個三角形數是
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個三角形數實質上就是等差數列{
任何一個正整數都可以表示成幾個素數的次方的乘積
假設
而一個正整數擁有的約數個數爲:
程序
程序中用到的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;
}
}
}