问题12-求因子个数超过500个的第一个三角数

问题描述如下:

三角数为符合如下标准:

第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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值