CodeWars练习之三角数

今天遇到一个题目:判断一个数是不是三角数。三角数的意思是,从1到这个数以第n行n个数刚好能排出n行。就好像1,3,6,10是三角数一样。

  1
 2 3
4 5 6

我开始的想法是判断这个数是不是从1到某个数的和,在求和这里我用了递归,结果在数值比较大的时候出现了栈溢出的情况。像这样:

public static int sum(int n){
		 if(n==1||n==0){
			 return n;
		 }else{
			 return n*sum(n-1);
		 }
	}

因为栈溢出所以是不过关的程序嘛,然后就查了一下是否有三角数这个概念,果然有,而且第一个规则就是:如果N*(N+1)/2等于N,则N就是三角数。可是这个公式不正是等差数列求和公式吗,公差是1。然后我就修改了sum函数,如下:
public static int sum(int n){
		 return n*(n+1)/2;
	}
最终的解法是:
	public static boolean isTriangleNumber(long number) {
		boolean flag=false;
		int n=0;
		while(n<number){
			if (number==sum(n)) {
				flag=true;
				break;
			}
			n++;			
		}
		return flag;		
  }
写完之后本来想提交的,然后仔细看了一下很多人的解法,他们都是用这个法子:
public class TriangleNumbers {

  public static Boolean isTriangleNumber(long number) {
    /* if A is a triangle number with N level, then A = (N +1)*N/2
     * then, we have : N^2 + N -2A = 0
     * solve this equation and check if N is an integer
     * to conclude whether A is a triangle number or not.
     * Delta = 1 + 8A => N = [-1+ SQRT(Delta)]/2
     */
    double N = (Math.sqrt(1+number*8) - 1)/2;
    return (N == Math.round(N));
  }
}
再重新看资料,才发现确实有这个法子:

可是还是看不懂 大哭 大哭,主要也是看到很多人都用这个法子,然后看到英文的时候还是会偶尔略过。然后问同学才想起来,这里就是求n的啊,一元二次方程的解。



所以这就是上面的解法了。哦耶!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值