La raíz más pequeña de la ecuación x^2 + s(x)*x – n = 0, donde s(x) es la suma de los dígitos de la raíz x.

Se le da un número entero n, encuentre la raíz entera positiva más pequeña de la ecuación x, o imprima -1 si no se encuentran raíces.
Ecuación: x^2 + s(x)*x – n = 0
donde x, n son números enteros positivos, s(x) es la función, igual a la suma de los dígitos del número x en el sistema numérico decimal. 
1 <= norte <= 10^18

Ejemplos: 

Input: N = 110 
Output: 10 
Explanation: x = 10 is the minimum root. 
             As s(10) = 1 + 0 = 1 and 
             102 + 1*10 - 110=0.  

Input: N = 4
Output: -1 
Explanation: there are no roots of the 
equation possible

Un enfoque ingenuo será iterar a través de todos los valores posibles de X y averiguar si existe alguna raíz de este tipo, pero esto no será posible ya que el valor de n es muy grande.

Un enfoque eficiente sería el siguiente 
. En primer lugar, encontremos el intervalo de valores posibles de s(x). Por lo tanto, x ^ 2 <= N y N <= 10 ^ 18, x <= 109. En otras palabras, para cada solución considerable x, la longitud decimal de x no se extiende 10 dígitos. Entonces Smax = s(9999999999) = 10*9 = 90. 
Hagamos fuerza bruta en el valor de s(x) (0 <= s(x) <= 90). Ahora tenemos una ecuación cuadrada ordinaria. El trato es resolver la ecuación y comprobar que el valor actual de fuerza bruta de s(x) es igual a la suma de los dígitos de la solución. Si la solución existe y se mantiene la igualdad, debemos obtener la respuesta y almacenar el mínimo posible de raíces.

A continuación se muestra la implementación del enfoque anterior.  

C++

// CPP program to find smallest value of root
// of an equation under given constraints.
#include <bits/stdc++.h>
using namespace std;
 
// function to check if the sum of digits is
// equal to the summation assumed
bool check(long long a, long long b)
{
    long long int c = 0;
 
    // calculate the sum of digit
    while (a != 0) {
        c = c + a % 10;
        a = a / 10;
    }
 
    return (c == b);
}
 
// function to find the largest root possible.
long long root(long long n)
{
    bool found = 0;
    long long mx = 1e18;
 
    // iterate for all possible sum of digits.
    for (long long i = 0; i <= 90; i++) {
 
        // check if discriminant is a perfect square.
        long long s = i * i + 4 * n;
        long long sq = sqrt(s);
 
        // check if discriminant is a perfect square and
        // if it as perfect root of the equation
        if (sq * sq == s && check((sq - i) / 2, i)) {
            found = 1;
            mx = min(mx, (sq - i) / 2);
        }
    }
 
    // function returns answer
    if (found)
        return mx;
    else
        return -1;
}
 
// driver program to check the above function
int main()
{
    long long n = 110;
    cout << root(n);
}

Java

// Java program to find smallest value of root
// of an equation under given constraints.
 
class GFG{
// function to check if the sum of digits is
// equal to the summation assumed
static boolean check(long a, long b)
{
    long c = 0;
 
    // calculate the sum of digit
    while (a != 0) {
        c = c + a % 10;
        a = a / 10;
    }
 
    return (c == b);
}
 
// function to find the largest root possible.
static long root(long n)
{
    boolean found = false;
    long mx = (long)1E18;
 
    // iterate for all possible sum of digits.
    for (long i = 0; i <= 90; i++) {
 
        // check if discriminant is a perfect square.
        long s = i * i + 4 * n;
        long sq = (long)Math.sqrt(s);
 
        // check if discriminant is a perfect square and
        // if it as perfect root of the equation
        if (sq * sq == s && check((sq - i) / 2, i)) {
            found = true;
            mx = Math.min(mx, (sq - i) / 2);
        }
    }
 
    // function returns answer
    if (found)
        return mx;
    else
        return -1;
}
 
// driver program to check the above function
public static void main(String[] args)
{
    long n = 110;
    System.out.println(root(n));
}
}
// This code is contributed by mits

Python3

# Python3 program to find smallest
# value of root of an equation
# under given constraints.
import math
 
# function to check if the sum
# of digits is equal to the
# summation assumed
def check(a, b):
    c = 0;
 
    # calculate the
    # sum of digit
    while (a != 0):
        c = c + a % 10;
        a = int(a / 10);
 
    return True if(c == b) else False;
 
# function to find the
# largest root possible.
def root(n):
    found = False;
     
    # float(1E+18)
    mx = 1000000000000000001;
 
    # iterate for all
    # possible sum of digits.
    for i in range(91):
 
        # check if discriminant
        # is a perfect square.
        s = i * i + 4 * n;
        sq = int(math.sqrt(s));
 
        # check if discriminant is
        # a perfect square and
        # if it as perfect root
        # of the equation
        if (sq * sq == s and
            check(int((sq - i) / 2), i)):
            found = True;
            mx = min(mx, int((sq-i) / 2));
 
    # function returns answer
    if (found):
        return mx;
    else:
        return -1;
 
# Driver Code
n = 110;
print(root(n));
 
# This code is contributed by mits

C#

//C# program to find smallest value of root
// of an equation under given constraints.
using System;
public class GFG{
    // function to check if the sum of digits is
    // equal to the summation assumed
    static bool check(long a, long b)
    {
        long c = 0;
 
        // calculate the sum of digit
        while (a != 0) {
            c = c + a % 10;
            a = a / 10;
        }
 
        return (c == b);
    }
 
    // function to find the largest root possible.
    static long root(long n)
    {
        bool found = false;
        long mx = (long)1E18;
 
        // iterate for all possible sum of digits.
        for (long i = 0; i <= 90; i++) {
 
            // check if discriminant is a perfect square.
            long s = i * i + 4 * n;
            long sq = (long)Math.Sqrt(s);
 
            // check if discriminant is a perfect square and
            // if it as perfect root of the equation
            if (sq * sq == s && check((sq - i) / 2, i)) {
                found = true;
                mx = Math.Min(mx, (sq - i) / 2);
            }
        }
 
        // function returns answer
        if (found)
            return mx;
        else
            return -1;
    }
 
    // driver program to check the above function
    public static void Main()
    {
        long n = 110;
        Console.Write(root(n));
    }
}
// This code is contributed by Raput-Ji

PHP

<?php
// PHP program to find
// smallest value of root
// of an equation under
// given constraints.
 
// function to check if
// the sum of digits is
// equal to the summation
// assumed
function check($a, $b)
{
    $c = 0;
 
    // calculate the
    // sum of digit
    while ($a != 0)
    {
        $c = $c + $a % 10;
        $a = (int)($a / 10);
    }
 
    return ($c == $b) ? true : false;
}
 
// function to find the
// largest root possible.
function root($n)
{
    $found = false;
     
    // float(1E+18)
    $mx = 1000000000000000001;
 
    // iterate for all
    // possible sum of digits.
    for ($i = 0; $i <= 90; $i++)
    {
 
        // check if discriminant
        // is a perfect square.
        $s = $i * $i + 4 * $n;
        $sq = (int)(sqrt($s));
 
        // check if discriminant is
        // a perfect square and
        // if it as perfect root
        // of the equation
        if ($sq * $sq == $s &&
            check((int)(($sq - $i) / 2), $i))
        {
            $found = true;
            $mx = min($mx, (int)(($sq -
                                  $i) / 2));
        }
    }
 
    // function returns answer
    if ($found)
        return $mx;
    else
        return -1;
}
 
// Driver Code
$n = 110;
echo root($n);
 
// This code is contributed by mits
?>

Javascript

<script>
 
// Javascript program to find smallest
// value of root of an equation under
// given constraints.   
 
// Function to check if the sum of digits is
// equal to the summation assumed
function check(a, b)
{
    var c = 0;
 
    // Calculate the sum of digit
    while (a != 0)
    {
        c = c + a % 10;
        a = parseInt(a / 10);
    }
 
    return (c == b);
}
 
// Function to find the largest root possible.
function root(n)
{
    var found = false;
    var mx =  1E18;
 
    // Iterate for all possible
    // sum of digits.
    for(i = 0; i <= 90; i++)
    {
         
        // Check if discriminant is a
        // perfect square.
        var s = i * i + 4 * n;
        var sq =  Math.sqrt(s);
 
        // Check if discriminant is a
        // perfect square and if it as
        // perfect root of the equation
        if (sq * sq == s && check((sq - i) / 2, i))
        {
            found = true;
            mx = Math.min(mx, (sq - i) / 2);
        }
    }
 
    // Function returns answer
    if (found)
        return mx;
    else
        return -1;
}
 
// Driver code
var n = 110;
 
document.write(root(n));
 
// This code is contributed by todaysgaurav
 
</script>

Producción: 

10 

Complejidad de tiempo : O (90 * log (sqrt (N))), ya que estamos usando bucles anidados para recorrer 90 * log (sqrt (N)) veces.

Espacio auxiliar : O(1), ya que no estamos utilizando ningún espacio adicional.

Publicación traducida automáticamente

Artículo escrito por Striver 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 *