三角形数数列是通过逐个加上自然数来生成的。例如,第7个三角形数是 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个约数的三角形数是多少?
public class TriangularNumber {
//*********方法一: 使用do...while()循环************
public static long yueshu(int limit) {
long sum = 0;
int i = 0;
int count;
// 求三角形数
do {
i = i + 1;
count = 0; //记录三角形数的约数个数
sum = sum + i;
//求约数的个数
for(int j=1;j<=sum;j++) {
if(sum % j ==0) {
count++;
}
}
}
while(count <= limit); //当达到500个约数
return sum;
}
//*********方法二: 使用for()循环************
public static long yueshufor(int limit) {
long sum = 0;
int count = 0; //记录三角形数的约数个数
// 求三角形数
for(int i=1;i<Integer.MAX_VALUE;i++) {
count = 0; //记录三角形数的约数个数
sum = sum + i;
//求约数的个数
for(int j=1;j<=sum;j++) {
if(sum % j ==0) {
count++;
}
}
//当达到500个约数
if(count > limit)
break;
}
return sum;
}
//*********方法三: 参考答案************
public static long triangular_number(int max) {
int sum=0;
for(int i=1;i<Integer.MAX_VALUE;i++) {
sum = sum +i;
if(Dixisibility_rule(sum) > max) {
return sum;
}
}
return -1;
}
private static int Dixisibility_rule(int num) {
int prime = (int)Math.sqrt(num);
int i =1;
int sum = 0;
while(i <= prime) {
if(num%i ==0) {
sum++;
}
i++;
}
return prime*prime == num ? 2*sum-1:2*sum;
}