Semillas (o raíces de semillas) de un número

Una Semilla de un número n es un número x tal que la multiplicación de x por sus dígitos es igual a n. La tarea es encontrar todas las semillas de un número dado n. Si no existe ninguna semilla, imprima lo mismo.
Ejemplos: 
 

Input  : n = 138
Output : 23 
23 is a seed of 138 because
23*2*3 is equal to 138

Input : n = 4977
Output : 79 711 
79 is a seed of 4977 because
79 * 7 * 9 = 4977.
711 is also a seed of 4977 because
711 * 1 * 1 * 7 = 4977

Input  : n = 9
Output : No seed exists

Input  : n = 738
Output : 123 

Preguntado en Epic
 

La idea es recorrer todos los números del 1 al n/2. Para cada número que se recorre, encuentre el producto de los dígitos con el número. Una optimización importante realizada en el siguiente programa es evitar volver a calcular los productos de dígitos. Almacenamos los productos en una array. Si ya se ha calculado un producto, lo devolvemos, de lo contrario lo calculamos.
A continuación se muestra la implementación de la idea. 
 

C++

// C++ program to find Seed of a number
#include <bits/stdc++.h>
using namespace std;
const int MAX = 10000;
 
int prodDig[MAX];
 
// Stores product of digits of x in prodDig[x]
int getDigitProduct(int x)
{
    // If x has single digit
    if (x < 10)
      return x;
 
    // If digit product is already computed
    if (prodDig[x] != 0)
       return prodDig[x];
 
    // If digit product is not computed before.
    int prod = (x % 10) * getDigitProduct(x/10);
 
    return (prodDig[x] = prod);
}
 
// Prints all seeds of n
void findSeed(int n)
{
    // Find all seeds using prodDig[]
    vector<int> res;
    for (int i=1; i<=n/2; i++)
        if (i*getDigitProduct(i) == n)
            res.push_back(i);
 
    // If there was no seed
    if (res.size() == 0)
    {
        cout << "NO seed exists\n";
        return;
    }
 
    // Print seeds
    for (int i=0; i<res.size(); i++)
        cout << res[i] << " ";
}
 
// Driver code
int main()
{
    long long int n = 138;
    findSeed(n);
    return 0;
}

Java

// Java program to find Seed of a number
import java.util.*;
 
class GFg{
static int MAX = 10000;
static int[] prodDig=new int[MAX];
 
// Stores product of digits of x in prodDig[x]
static int getDigitProduct(int x)
{
    // If x has single digit
    if (x < 10)
    return x;
 
    // If digit product is already computed
    if (prodDig[x] != 0)
    return prodDig[x];
 
    // If digit product is not computed before.
    int prod = (x % 10) * getDigitProduct(x/10);
 
    return (prodDig[x] = prod);
}
 
// Prints all seeds of n
static void findSeed(int n)
{
    // Find all seeds using prodDig[]
    List<Integer> res = new ArrayList<Integer>();
    for (int i=1; i<=n/2; i++)
        if (i*getDigitProduct(i) == n)
            res.add(i);
 
    // If there was no seed
    if (res.size() == 0)
    {
        System.out.println("NO seed exists");
        return;
    }
 
    // Print seeds
    for (int i=0; i<res.size(); i++)
        System.out.print(res.get(i)+" ");
}
 
// Driver code
public static void main(String[] args)
{
    int n = 138;
    findSeed(n);
 
}
}
// this code is contributed by mits

Python3

# Python3 program to find Seed of a number
 
MAX = 10000;
 
prodDig = [0] * MAX;
 
# Stores product of digits of
# x in prodDig[x]
def getDigitProduct(x):
     
    # If x has single digit
    if (x < 10):
        return x;
 
    # If digit product is already computed
    if (prodDig[x] != 0):
        return prodDig[x];
 
    # If digit product is not computed before.
    prod = (int(x % 10) *
            getDigitProduct(int(x / 10)));
 
    prodDig[x] = prod;
    return prod;
 
# Prints all seeds of n
def findSeed(n):
 
    # Find all seeds using prodDig[]
    res = [];
    for i in range(1, int(n / 2 + 2)):
        if (i * getDigitProduct(i) == n):
            res.append(i);
 
    # If there was no seed
    if (len(res) == 0):
        print("NO seed exists");
        return;
 
    # Print seeds
    for i in range(len(res)):
        print(res[i], end = " ");
 
# Driver code
n = 138;
findSeed(n);
 
# This code is contributed by mits

C#

// C# program to find Seed of a number
using System;
using System.Collections;
 
class GFG{
     
static int MAX = 10000;
static int[] prodDig=new int[MAX];
 
// Stores product of digits of x in prodDig[x]
static int getDigitProduct(int x)
{
    // If x has single digit
    if (x < 10)
    return x;
 
    // If digit product is already computed
    if (prodDig[x] != 0)
    return prodDig[x];
 
    // If digit product is not computed before.
    int prod = (x % 10) * getDigitProduct(x/10);
 
    return (prodDig[x] = prod);
}
 
// Prints all seeds of n
static void findSeed(int n)
{
    // Find all seeds using prodDig[]
    ArrayList res = new ArrayList();
    for (int i=1; i<=n/2; i++)
        if (i*getDigitProduct(i) == n)
            res.Add(i);
 
    // If there was no seed
    if (res.Count == 0)
    {
        Console.WriteLine("NO seed exists");
        return;
    }
 
    // Print seeds
    for (int i=0; i<res.Count; i++)
        Console.WriteLine(res[i]+" ");
}
 
// Driver code
static void Main()
{
    int n = 138;
    findSeed(n);
 
}
}
// this code is contributed by mits

PHP

<?php
// PHP program to find Seed of a number
 
$MAX = 10000;
 
$prodDig = array_fill(0, $MAX, 0);
 
// Stores product of digits of x in prodDig[x]
function getDigitProduct($x)
{
    global $prodDig;
     
    // If x has single digit
    if ($x < 10)
    return $x;
 
    // If digit product is already computed
    if ($prodDig[$x] != 0)
    return $prodDig[$x];
 
    // If digit product is not computed before.
    $prod = (int)($x % 10) *
                  getDigitProduct((int)($x / 10));
 
    $prodDig[$x] = $prod;
    return $prod;
}
 
// Prints all seeds of n
function findSeed($n)
{
    // Find all seeds using prodDig[]
    $res = array();
    for ($i = 1; $i <= (int)($n / 2 + 1); $i++)
        if ($i * getDigitProduct($i) == $n)
            array_push($res, $i);
 
    // If there was no seed
    if (count($res) == 0)
    {
        echo "NO seed exists\n";
        return;
    }
 
    // Print seeds
    for ($i = 0; $i < count($res); $i++)
        echo $res[$i] . " ";
}
 
// Driver code
$n = 138;
findSeed($n);
 
// This code is contributed by mits
?>

Javascript

<script>
 
// Javascript program to find Seed of a number
  
 
var MAX = 10000;
var prodDig=Array.from({length: MAX}, (_, i) => 0);
 
// Stores product of digits of x in prodDig[x]
function getDigitProduct(x)
{
    // If x has single digit
    if (x < 10)
    return x;
 
    // If digit product is already computed
    if (prodDig[x] != 0)
    return prodDig[x];
 
    // If digit product is not computed before.
    var prod = (x % 10) *
    getDigitProduct(parseInt(x/10));
 
    return (prodDig[x] = prod);
}
 
// Prints all seeds of n
function findSeed(n)
{
    // Find all seeds using prodDig
    var res = [];
     
    for (var i=1; i<=parseInt(n/2); i++)
        if (i*getDigitProduct(i) == n)
            res.push(i);
 
    // If there was no seed
    if (res.length == 0)
    {
        document.write("NO seed exists");
        return;
    }
 
    // Print seeds
    for (i=0; i<res.length; i++)
        document.write(res[i]+" ");
}
 
// Driver code
var n = 138;
findSeed(n);
 
 
// This code is contributed by 29AjayKumar
 
</script>

Producción : 

23

Optimización adicional: 
podemos optimizar aún más el código anterior. La idea es hacer una llamada a getDigitProduct(i) solo si i es divisible por n. Consulte https://ide.geeksforgeeks.org/oLYduu para la implementación.
Este artículo es una contribución de Rakesh Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a contribuir@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

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