Seeds (Or Seed Roots) of a number
Last Updated :
13 Sep, 2023
A Seed of a number n is a number x such that multiplication of x with its digits is equal to n. The task is to find all seeds of a given number n. If no seed exists, then print the same.
Examples:
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
Asked in Epic
The idea is to traverse all numbers from 1 to n/2. For every number being traversed, find product of digits with the number. An important optimization done in below program is to avoid re-computations of digit products. We store the products in an array. If a product has already been computed, we return it, else we compute it.
Below is the implementation of the idea.
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX = 10000;
int prodDig[MAX];
int getDigitProduct( int x)
{
if (x < 10)
return x;
if (prodDig[x] != 0)
return prodDig[x];
int prod = (x % 10) * getDigitProduct(x/10);
return (prodDig[x] = prod);
}
void findSeed( int n)
{
vector< int > res;
for ( int i=1; i<=n/2; i++)
if (i*getDigitProduct(i) == n)
res.push_back(i);
if (res.size() == 0)
{
cout << "NO seed exists\n" ;
return ;
}
for ( int i=0; i<res.size(); i++)
cout << res[i] << " " ;
}
int main()
{
long long int n = 138;
findSeed(n);
return 0;
}
|
Java
import java.util.*;
class GFg{
static int MAX = 10000 ;
static int [] prodDig= new int [MAX];
static int getDigitProduct( int x)
{
if (x < 10 )
return x;
if (prodDig[x] != 0 )
return prodDig[x];
int prod = (x % 10 ) * getDigitProduct(x/ 10 );
return (prodDig[x] = prod);
}
static void findSeed( int n)
{
List<Integer> res = new ArrayList<Integer>();
for ( int i= 1 ; i<=n/ 2 ; i++)
if (i*getDigitProduct(i) == n)
res.add(i);
if (res.size() == 0 )
{
System.out.println( "NO seed exists" );
return ;
}
for ( int i= 0 ; i<res.size(); i++)
System.out.print(res.get(i)+ " " );
}
public static void main(String[] args)
{
int n = 138 ;
findSeed(n);
}
}
|
Python3
MAX = 10000 ;
prodDig = [ 0 ] * MAX ;
def getDigitProduct(x):
if (x < 10 ):
return x;
if (prodDig[x] ! = 0 ):
return prodDig[x];
prod = ( int (x % 10 ) *
getDigitProduct( int (x / 10 )));
prodDig[x] = prod;
return prod;
def findSeed(n):
res = [];
for i in range ( 1 , int (n / 2 + 2 )):
if (i * getDigitProduct(i) = = n):
res.append(i);
if ( len (res) = = 0 ):
print ( "NO seed exists" );
return ;
for i in range ( len (res)):
print (res[i], end = " " );
n = 138 ;
findSeed(n);
|
C#
using System;
using System.Collections;
class GFG{
static int MAX = 10000;
static int [] prodDig= new int [MAX];
static int getDigitProduct( int x)
{
if (x < 10)
return x;
if (prodDig[x] != 0)
return prodDig[x];
int prod = (x % 10) * getDigitProduct(x/10);
return (prodDig[x] = prod);
}
static void findSeed( int n)
{
ArrayList res = new ArrayList();
for ( int i=1; i<=n/2; i++)
if (i*getDigitProduct(i) == n)
res.Add(i);
if (res.Count == 0)
{
Console.WriteLine( "NO seed exists" );
return ;
}
for ( int i=0; i<res.Count; i++)
Console.WriteLine(res[i]+ " " );
}
static void Main()
{
int n = 138;
findSeed(n);
}
}
|
PHP
<?php
$MAX = 10000;
$prodDig = array_fill (0, $MAX , 0);
function getDigitProduct( $x )
{
global $prodDig ;
if ( $x < 10)
return $x ;
if ( $prodDig [ $x ] != 0)
return $prodDig [ $x ];
$prod = (int)( $x % 10) *
getDigitProduct((int)( $x / 10));
$prodDig [ $x ] = $prod ;
return $prod ;
}
function findSeed( $n )
{
$res = array ();
for ( $i = 1; $i <= (int)( $n / 2 + 1); $i ++)
if ( $i * getDigitProduct( $i ) == $n )
array_push ( $res , $i );
if ( count ( $res ) == 0)
{
echo "NO seed exists\n" ;
return ;
}
for ( $i = 0; $i < count ( $res ); $i ++)
echo $res [ $i ] . " " ;
}
$n = 138;
findSeed( $n );
?>
|
Javascript
<script>
var MAX = 10000;
var prodDig=Array.from({length: MAX}, (_, i) => 0);
function getDigitProduct(x)
{
if (x < 10)
return x;
if (prodDig[x] != 0)
return prodDig[x];
var prod = (x % 10) *
getDigitProduct(parseInt(x/10));
return (prodDig[x] = prod);
}
function findSeed(n)
{
var res = [];
for ( var i=1; i<=parseInt(n/2); i++)
if (i*getDigitProduct(i) == n)
res.push(i);
if (res.length == 0)
{
document.write( "NO seed exists" );
return ;
}
for (i=0; i<res.length; i++)
document.write(res[i]+ " " );
}
var n = 138;
findSeed(n);
</script>
|
Output :
23
Further Optimization :
We can further optimize above code. The idea is to make a call to getDigitProduct(i) only if i is divisible by n. Please refer https://ide.geeksforgeeks.org/oLYduu for implementation.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...