我试图在这个选定的方格中找到行号:
例如,如果我选择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){
}
}
答案 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;
}