如何在三角形数字序列中查找所选数字的行号?

时间:2016-09-15 15:33:08

标签: java if-statement

我试图在这个选定的方格中找到行号:

enter image description here

例如,如果我选择getRow(17),我会得到answer = 6。我甚至都不知道从哪里开始。有人能指出我正确的方向吗?

class RowShelf{
   public static void main(String[] args) {
      getRow(24); // ans = 7
      getRow(17); // ans = 6
   }

   public static int getRow(int sq){

  }
}

4 个答案:

答案 0 :(得分:2)

很简单,请使用while-loop

public static int getRow(int number) {
    int result=0;
    int sum=0;  
    while(sum<number) {
        result++;
        sum+=result;
    }
    return result;
}

每次迭代都会向sum变量添加一个比迭代更多的值,直到达到设置为参数的限制为止。返回循环次数,即结果。

检查输出:

getRow(24);      // 7
getRow(17);      // 6
getRow(1765465); // 1879

改善@ Shahid的答案会给你一个更直截了当的方法:

public static int getRow(int number) {
    return (int) Math.ceil((Math.sqrt(8*number+1)-1) / 2);
}

答案 1 :(得分:2)

看看模式。在主对角线中,您可以看到数字是行中所有数字的总和。换句话说,从您的图像中您可以看到:

sumDiag(1,1) = 1
sumDiag(2,2) = sumDiag(1,1) + 2
sumDiag(3,3) = sumDiag(2,2) + 3

这可以翻译成以下内容:

sumRow(1) = 1
sumRow(2) = 1 + 2 = 3
sumRow(3) = 1 + 2 + 3 = 6

which is: (r+1)*(r)/2

因此,您需要找到上限和下限,以了解哪一行是您要查找的数字。这将是最佳解决方案,因为正如您所说“行是无限的”

从您想要查找的代码中getRow(24)

如果您按照我的提示操作,您会注意到sumRow(7) = 28 and sum(6) = 21

24介于28和21之间,因此行为7

答案 2 :(得分:2)

对于三角数n,其中r是行号:

n = r(r+1) / 2
=> r^2 + r - 2n = 0

直接的数学表达式是:

r = (sqrt(8n+1)-1) / 2

为此编码。

答案 3 :(得分:0)

round(sqrt(2 * n))

当我试图解决UVa在线判断问题时,这对我有用。它适用于高达10 ^ 18的数字。

以下是输出行的代码:

long long getRow( long long n ){
    double row = round(sqrt(2*n));
    return (long long)row;
}