Java 如何把水果整齐地堆成一堆

Java 如何把水果整齐地堆成一堆,java,math,factorial,Java,Math,Factorial,我选择Java来处理这个问题,因为Java语言非常简单,任何人都可以翻译 用什么数学算法来确定底线上的水果数量,以这样的模式堆叠X个水果?(忽略2的幂,我将其堆叠在一个正方形中) 起初我认为这很容易,但随着数字越来越高,我开始认为这更像是一个阶乘 编辑:添加从@templatetypedef提供的以下答案翻译过来的代码 private int _getBottomLineCount() { double insideSquareRoot = (8 * numberOfApples) +1

我选择Java来处理这个问题,因为Java语言非常简单,任何人都可以翻译

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

起初我认为这很容易,但随着数字越来越高,我开始认为这更像是一个阶乘

编辑:添加从@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
}

高度为n的金字塔中的果实数由方程给出的第n个三角形数给出

Tn=n(n+1)/2

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

如果你有k个水果要放进一堆,你要找的是最小的n,比如Tn≥ K您可以直接解决此问题:

Tn=k

n(n+1)/2=k

n2+n=2k

n2+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的水果来储存水果


希望这有帮助

先从相反的角度看。回答以下问题:“如果底线上的水果数量为n,您可以堆叠的最大水果数量是多少?”?一旦你明白了这一点,你应该能够用高中代数来回答你原来的问题。你介意再往前走一步吗?或者只是澄清部分空行是否可以?如果你对部分空行没有问题,那么当前的答案是可行的,但如果不是,则需要更多的努力。另外,如何在一个正方形中叠加2的奇数幂?如果你真的要叠加水果,那么应该在三维中进行。@Teepeemm这取决于水果。我想你可以像发问者描述的那样叠香蕉。橘子,没那么多。三角形/金字塔的高度正是我所需要的!起初,我在代码中遇到了一些怪癖,但这是我意外添加的额外+1。你的数学算出来了,谢谢你的精彩解释(和例子)!
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
}