📜  硬币排列成三角形时的最大高度

📅  最后修改于: 2021-05-04 16:56:58             🧑  作者: Mango

我们有N个硬币需要以三角形的形式排列,即第一行将有1个硬币,第二行将有2个硬币,依此类推,我们需要告诉我们使用这N个硬币可以达到的最大高度。
例子:

Input : N = 7
Output : 3
Maximum height will be 3, putting 1, 2 and
then 3 coins. It is not possible to use 1 
coin left.

Input : N = 12
Output : 4
Maximum height will be 4, putting 1, 2, 3 and 
4 coins, it is not possible to make height as 5, 
because that will require 15 coins.

通过找到三角形的高度和硬币数量之间的关系可以解决该问题。假设最大高度为H,则硬币的总和应小于N,

Sum of coins for height H <= N
            H*(H + 1)/2  <= N
        H*H + H – 2*N <= 0
Now by Quadratic formula 
(ignoring negative root)

Maximum H can be (-1 + √(1 + 8N)) / 2 

Now we just need to find the square root of (1 + 8N) for
which we can use Babylonian method of finding square root

下面的代码是在上述概念上实现的,

CPP
//  C++ program to find maximum height of arranged
// coin triangle
#include 
using namespace std;
 
/* Returns the square root of n. Note that the function */
float squareRoot(float n)
{
    /* We are using n itself as initial approximation
      This can definitely be improved */
    float x = n;
    float y = 1;
 
    float e = 0.000001; /* e decides the accuracy level*/
    while (x - y > e)
    {
        x = (x + y) / 2;
        y = n/x;
    }
    return x;
}
 
//  Method to find maximum height of arrangement of coins
int findMaximumHeight(int N)
{
    //  calculating portion inside the square root
    int n = 1 + 8*N;
    int maxH = (-1 + squareRoot(n)) / 2;
    return maxH;
}
 
//  Driver code to test above method
int main()
{
    int N = 12;
    cout << findMaximumHeight(N) << endl;
    return 0;
}


Java
// Java program to find maximum height
// of arranged coin triangle
class GFG
{
     
    /* Returns the square root of n.
    Note that the function */
    static float squareRoot(float n)
    {
         
        /* We are using n itself as
        initial approximation.This
        can definitely be improved */
        float x = n;
        float y = 1;
         
        // e decides the accuracy level
        float e = 0.000001f;
        while (x - y > e)
        {
            x = (x + y) / 2;
            y = n / x;
        }
         
        return x;
    }
     
    // Method to find maximum height
    // of arrangement of coins
    static int findMaximumHeight(int N)
    {
         
        // calculating portion inside
        // the square root
        int n = 1 + 8*N;
        int maxH = (int)(-1 + squareRoot(n)) / 2;
         
        return maxH;
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int N = 12;
         
        System.out.print(findMaximumHeight(N));
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python3 program to find
# maximum height of arranged
# coin triangle
 
# Returns the square root of n.
# Note that the function
def squareRoot(n):
  
    # We are using n itself as
        # initial approximation
    # This can definitely be improved
    x = n
    y = 1
 
    e = 0.000001  # e decides the accuracy level
    while (x - y > e):
        x = (x + y) / 2
        y = n/x
         
    return x
  
 
# Method to find maximum height
# of arrangement of coins
def findMaximumHeight(N):
  
    # calculating portion inside the square root
    n = 1 + 8*N
    maxH = (-1 + squareRoot(n)) / 2
    return int(maxH)
  
 
# Driver code to test above method
N = 12
print(findMaximumHeight(N))
 
# This code is contributed by
# Smitha Dinesh Semwal


C#
// C# program to find maximum height
// of arranged coin triangle
using System;
 
class GFG
{
    /* Returns the square root of n.
    Note that the function */
    static float squareRoot(float n)
    {
        /* We are using n itself as
        initial approximation.This
        can definitely be improved */
        float x = n;
        float y = 1;
 
        // e decides the accuracy level
        float e = 0.000001f;
        while (x - y > e)
        {
            x = (x + y) / 2;
            y = n / x;
        }
        return x;
    }
     
    static int findMaximumHeight(int N)
    {
 
        // calculating portion inside
        // the square root
        int n = 1 + 8*N;
        int maxH = (int)(-1 + squareRoot(n)) / 2;
 
        return maxH;
    }
 
    /* program to test above function */
    public static void Main()
    {
        int N = 12;
        Console.Write(findMaximumHeight(N));
    }
}
 
// This code is contributed by _omg


PHP
 $e)
    {
        $x = ($x + $y) / 2;
        $y = $n/$x;
    }
    return $x;
}
 
// Method to find maximum height of
// arrangement of coins
function findMaximumHeight( $N)
{
     
    // calculating portion inside
    // the square root
    $n = 1 + 8 * $N;
    $maxH = (-1 + squareRoot($n)) / 2;
    return floor($maxH);
}
 
// Driver code to test above method
$N = 12;
echo findMaximumHeight($N) ;
 
// This code is contributed by anuj_67.
?>


Javascript


输出:

4