Número de lados del polígono cuando se da el máximo número posible de diagonales

Dado un número K que es el máximo número posible de diagonales en cualquier polígono, la tarea es encontrar el número de lados de ese polígono.

Ejemplos:

Entrada: 2
Salida: 4
Explicación: Un cuadrilátero tiene 2 diagonales como máximo.

Entrada: 6
Salida : -1
Explicación: Ningún polígono tiene como máximo 6 diagonales.

 

Enfoque: Este problema se puede resolver con base en la siguiente observación matemática:

Intuición:

para un polígono convexo de n lados , desde cada vértice, podemos dibujar (n – 3) diagonales. 
Siguiendo este camino para n-vértices , habrá n*(n – 3) diagonales pero cada diagonal se calcula dos veces. 
Entonces el número total de diagonales se convierte en n*(n – 3)/2

Por lo tanto:
n*(n – 3) / 2 = K
n*(n – 3) – 2 *K = 0
n 2 – 3*n -2*K = 0
Cuando esto se compara con la representación general de la ecuación cuadrática ( ax 2 + bx + c)
a = 1, b = -3, c = -2 *K
para esta ecuación.

Resuelve la ecuación para obtener el valor de n que es:
n = (-b ± √(b 2 – 4ac) )/ 2a

Siga los pasos mencionados a continuación para implementar la idea:

  • Use la fórmula derivada arriba para encontrar el valor de n :
  • El discriminante d = b 2 – 4ac
    • Si d > 0: las raíces serán distintas y una de las raíces positivas será la respuesta
    • Si  d == 0:  las raíces serán iguales y esa será la respuesta
    • Si  d < 0:  las raíces serán imaginarias y la respuesta no existe

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the roots of quadratic equation
int findRoots(int K)
{
    int a = 1;
    int b = -3;
    int c = -2 * K;
 
    // Finding discriminant
    int d = b * b - 4 * a * c;
    double sqrt_val = sqrt(abs(d));
 
    // Root are distinct
    if (d > 0) {
        // roots of equation
        double x1 = (-b + sqrt_val) / (2 * a);
        double x2 = (-b - sqrt_val) / (2 * a);
 
        if ((int)x1 == x1 && x1 > 0)
            return (int(x1));
        else if ((int)x2 == x2 && x2 > 0)
            return (int(x2));
        else
            return -1;
    }
 
    // Roots are equal
    else if (d == 0) {
        // roots of equation
        double x1 = (-b / (2 * a));
        if ((int)x1 == x1 && x1 > 0)
            return (int(x1));
        else
            return -1;
    }
    // Root are imaginary
    else
        return -1;
}
 
// Driver code
int main()
{
    // K is number of diagonals
    int K = 9;
 
    // Function call
    cout << findRoots(K);
    return 0;
}
 
// This code is contributed by Rohit Pradhan

Java

// Java program for the above approach
import java.io.*;
 
class GFG {
 
  // Function to find the roots of quadratic equation
  static double findRoots(int K){
    int a = 1;
    int b = -3;
    int c = -2 * K;
 
    // Finding discriminant
    int d = b * b - 4 * a * c;
    double sqrt_val = Math.sqrt(Math.abs(d));
 
    // Root are distinct
    if (d > 0) {
      // roots of equation
      double x1 = (-b + sqrt_val) / (2 * a);
      double x2 = (-b - sqrt_val) / (2 * a);
 
      if ((int)x1 == x1 && x1 > 0)
        return x1;
      else if ((int)x2 == x2 && x2 > 0)
        return x2;
      else
        return -1;
    }
 
    // Roots are equal
    else if (d == 0)
    {
       
      // roots of equation
      double x1 = (-b / (2 * a));
      if ((int)x1 == x1 && x1 > 0)
        return x1;
      else
        return -1;
    }
     
    // Root are imaginary
    else
      return -1;
  }
 
  // Driver code
  public static void main (String[] args)
  {
     
    // K is number of diagonals
    int K = 9;
 
    // Function call
    System.out.println((int) findRoots(K));
  }
}
 
// This code is contributed by hrithikgarg03188.

Python3

# Python3 program for the above approach
 
import math
 
# Function to find the roots of quadratic equation
def findRoots(K):
    a = 1
    b = -3
    c = -2 * K
     
    # Finding discriminant
    d = b * b - 4 * a * c
    sqrt_val = math.sqrt(abs(d))
     
    # Root are distinct
    if d > 0:
           
        # roots of equation
        x1 = (-b + sqrt_val)/(2 * a)
        x2 = (-b - sqrt_val)/(2 * a)
         
        if int(x1) == x1 and x1 > 0:
            return (int(x1))
        elif int(x2) == x2 and x2 > 0:
            return (int(x2))
        else:
            return -1
     
    # Roots are equal
    elif d == 0:
       # roots of equation
        x1 = (-b / (2 * a))
        if int(x1) == x1 and x1 > 0:
            return (int(x1))
        else:
            return -1
             
    # Root are imaginary       
    else:
        return -1
 
# Driver code
if __name__ == '__main__':
     
    # K is number of diagonals
    K = 9
     
    # Function call
    print(findRoots(K))

C#

// C# code for the above discussed approach
using System;
using System.Collections.Generic;
 
public class GFG
{
 
  // Function to find the roots of quadratic equation
  static double findRoots(int K)
  {
    int a = 1;
    int b = -3;
    int c = -2 * K;
 
    // Finding discriminant
    int d = b * b - 4 * a * c;
    double sqrt_val = Math.Sqrt(Math.Abs(d));
 
    // Root are distinct
    if (d > 0) {
      // roots of equation
      double x1 = (-b + sqrt_val) / (2 * a);
      double x2 = (-b - sqrt_val) / (2 * a);
 
      if ((int)x1 == x1 && x1 > 0)
        return x1;
      else if ((int)x2 == x2 && x2 > 0)
        return x2;
      else
        return -1;
    }
 
    // Roots are equal
    else if (d == 0) {
 
      // roots of equation
      double x1 = (-b / (2 * a));
      if ((int)x1 == x1 && x1 > 0)
        return x1;
      else
        return -1;
    }
 
    // Root are imaginary
    else
      return -1;
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
 
    // K is number of diagonals
    int K = 9;
 
    // Function call
    Console.Write(findRoots(K));
  }
}
 
// This code is contributed by phasing17

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to find the roots of quadratic equation
function findRoots(K)
{
    let a = 1;
    let b = -3;
    let c = -2 * K;
 
    // Finding discriminant
    let d = b * b - 4 * a * c;
    let sqrt_val = Math.sqrt(Math.abs(d));
 
    // Root are distinct
    if (d > 0)
    {
     
        // roots of equation
        let x1 = (-b + sqrt_val) / (2 * a);
        let x2 = (-b - sqrt_val) / (2 * a);
 
        if (Math.floor(x1) == x1 && x1 > 0)
            return (Math.floor(x1));
        else if (Math.floor(x2) == x2 && x2 > 0)
            return (Math.floor(x2));
        else
            return -1;
    }
 
    // Roots are equal
    else if (d == 0)
    {
     
        // roots of equation
        let x1 = (-b / (2 * a));
        if (Math.floor(x1) == x1 && x1 > 0)
            return (Math.floor(x1));
        else
            return -1;
    }
     
    // Root are imaginary
    else
        return -1;
}
 
// Driver code
 
// K is number of diagonals
let K = 9;
 
// Function call
document.write(findRoots(K));
 
// This code is contributed by shinjanpatra
 
</script>
Producción

6

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por Atul_kumar_Shrivastava y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *