如何在整齐的堆中堆积水果

时间:2015-01-12 22:49:49

标签: java math factorial

我为这种情况选择了Java,因为语言很简单,任何人都可以翻译。

在这样的模式中,用什么数学算法来确定底线所需的水果数量来堆叠X个水果? (忽略2的力量,我叠加在一个正方形中)

 *  1
 * 2 3          = 2
 *
 *  1 2
 * 3 4 5        = 3
 *
 *   1
 *  2 3
 * 4 5 6        = 3
 *
 *  1 2 3
 * 4 5 6 7      = 4
 *
 *   1 2
 *  3 4 5
 * 6 7 8 9      = 4
 *
 *    1
 *   2 3
 *  4 5 6
 * 7 8 9 X      = 4
 *
 *   1 2 3
 *  3 4 5 6
 * 7 8 9 X 1    = 5

最初我认为这很容易,但随着数字越来越高,我开始认为它更像是一个因素。

编辑:添加以下由@templatetypedef提供的答案翻译的代码

private int _getBottomLineCount() {
    double insideSquareRoot = (8 * numberOfApples) +1;
    double squareRoot = Math.sqrt(insideSquareRoot);
    double val = (squareRoot -1) /2;

    return (int) Math.ceil(val); // Round it up to nearest whole number
}

1 个答案:

答案 0 :(得分:4)

高度为n的金字塔中的果实数量由第n个三角数给出,由等式给出

  

T n = n(n + 1)/ 2

例如,高度为2的金字塔可容纳2(2 + 1)/ 2 = 3个水果。高度为4的金字塔可容纳4(4 + 1)/ 2 = 10个水果。

如果你有k个水果放入堆叠,你正在寻找最小的数字n,使得T n ≥k。你可以直接解决这个问题:

  

T n = k

     

n(n + 1)/ 2 = k

     

n 2 + n = 2k

     

n 2 + n - 2k = 0

使用二次公式给出

  

n =( - 1±√(1 + 8k))/ 2

此处的否定根可以忽略,因此您的数字n应由

给出
  

n =(√(8k + 1) - 1)/ 2

这个数字可能不是整数,在这种情况下你要整理。

让我们试试一些例子。假设您有9个水果堆叠。我们可以评估上面的公式来获得

  

n =(√(72 + 1) - 1)/ 2 =(√(73) - 1)/ 2 = 3.772001873

舍入得到k = 4,所以你需要一个高度为4的堆栈。

假设你有137个水果堆叠。相同的公式给出了n = 16.060495162,因此您需要一个高度为17的堆栈来存储水果。

希望这有帮助!