问题描述如下:
“三角数为符合如下标准:
第7个数为1+2+3+4+...+7=28,前几个三角数为:1,,3,6,10,15,21,28......
让我们来看一下他们的因子:
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
因子个数超过5的第一个三角数为28,求因子个数超过500个的第一个三角数?”
代码实现如下:
/**
* 获得n的因子的个数
*
* @param n
* @return
*/
private static int getFactorNumber(int triangleNumber) {
int result = 0;
for (int i = 1; i <= triangleNumber; i++) {
if (triangleNumber % i == 0) {
result++;
}
}
return result;
}
/**
* 获得因子个数超过n个的三角数 此数符合某个标准如下: 如第7个数为1+2+3+4+5+6+7=28,
* 前几个数为1,3,6,10,15,21,28,36...
* t(n)=n(n+1)/2
* @param n
* @return
*/
private static int getTriangleNumber(int n) {
int triangleNumber = 0;
int j = 1;
int number=0;
while (number <= n) {
triangleNumber = j * (j + 1) / 2;
number = getFactorNumber(triangleNumber);
System.out.println(number);
System.out.println(triangleNumber);
j++;
}
return triangleNumber;
}
运行以上程序,要很长时间才能够得到结果76576500。
进行一些优化,
/**
* 获得n的因子的个数
*
* @param n
* @return
*/
private static int getFactorNumber1(int triangleNumber) {
int result = 0;
double max = Math.sqrt(triangleNumber);
for (int i = 1; i <= max; i++) {
if (triangleNumber % i == 0) {
result += 2;
}
if (i * i == triangleNumber) {//如果i是triangleNumber的平方根,总数减一
result--;
}
}
return result;
}
还有一些其他的方式来做,可以做一个提示,
1=2^0+3^0+5^0+7^0...+p^0,因子个数为(0+1)*(0+1)*(0+1)...*(0+1)=1
3= 2^0+3^1+5^0+7^0...+p^0,因子个数为(0+1)*(1+1)*(0+1)...*(0+1)=2
6=2^1+3^1+5^0+7^0...+p^0,因子个数为(1+1)*(1+1)*(0+1)...*(0+1)=4
...
28 = 2^2+3^0+5^0+7^1...+p^0,因子个数为(2+1)*(0+1)*(0+1)*(1+1)...*(0+1)=6
...
t(n) = 2^a1+3^a2+4^a3+...+p^ap,因子个数为(a1+1)*(a2+1)*(a3+1)*(a4+1)...*(ap+1)=n
到此结束。
请不吝赐教。
@anthor ClumsyBirdZ