# Smallest number k such that the product of digits of k is equal to n

Given a non-negative number n. The problem is to find the smallest number k such that the product of digits of k is equal to n. If no such number k can be formed then print “-1”.

Examples:

```Input : 100
Output : 455
4*5*5 = 100 and 455 is the
smallest possible number.

Input : 26
Output : -1
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: For each i = 9 to 2, repeatedly divide n by i until it cannot be further divided or the list of numbers from 9 to 2 gets finished. Also, in the process of division push each digit i onto the stack which divides n completely. After the above process gets completed check whether n == 1 or not. If not, then print “-1”, else form the number k using the digits from the stack containing the digits in the same sequence as popped from the stack.

## C++

 `// C++ implementation to find smallest number k such that ` `// the product of digits of k is equal to n ` `#include ` ` `  `using` `namespace` `std; ` ` `  `// function to find smallest number k such that ` `// the product of digits of k is equal to n ` `long` `long` `int` `smallestNumber(``int` `n) ` `{ ` `    ``// if 'n' is a single digit number, then ` `    ``// it is the required number ` `    ``if` `(n >= 0 && n <= 9) ` `        ``return` `n; ` `     `  `    ``// stack the store the digits ` `    ``stack<``int``> digits; ` `     `  `    ``// repeatedly divide 'n' by the numbers  ` `    ``// from 9 to 2 until all the numbers are  ` `    ``// used or 'n' > 1 ` `    ``for` `(``int` `i=9; i>=2 && n > 1; i--) ` `    ``{ ` `        ``while` `(n % i == 0) ` `        ``{ ` `            ``// save the digit 'i' that divides 'n' ` `            ``// onto the stack ` `            ``digits.push(i); ` `            ``n = n / i; ` `        ``} ` `    ``} ` `     `  `    ``// if true, then no number 'k' can be formed  ` `    ``if` `(n != 1) ` `        ``return` `-1; ` ` `  `    ``// pop digits from the stack 'digits' ` `    ``// and add them to 'k' ` `    ``long` `long` `int` `k = 0; ` `    ``while` `(!digits.empty()) ` `    ``{ ` `        ``k = k*10 + digits.top(); ` `        ``digits.pop(); ` `    ``} ` `     `  `    ``// required smallest number ` `    ``return` `k; ` `} ` ` `  `// Driver program to test above ` `int` `main() ` `{ ` `    ``int` `n = 100; ` `    ``cout << smallestNumber(n); ` `    ``return` `0; ` `}  `

## Java

 `//Java implementation to find smallest number k such that ` `// the product of digits of k is equal to n ` `import` `java.util.Stack; ` ` `  `public` `class` `GFG { ` ` `  `// function to find smallest number k such that ` `// the product of digits of k is equal to n ` `    ``static` `long` `smallestNumber(``int` `n) { ` `        ``// if 'n' is a single digit number, then ` `        ``// it is the required number ` `        ``if` `(n >= ``0` `&& n <= ``9``) { ` `            ``return` `n; ` `        ``} ` ` `  `        ``// stack the store the digits ` `        ``Stack digits = ``new` `Stack<>(); ` ` `  `        ``// repeatedly divide 'n' by the numbers  ` `        ``// from 9 to 2 until all the numbers are  ` `        ``// used or 'n' > 1 ` `        ``for` `(``int` `i = ``9``; i >= ``2` `&& n > ``1``; i--) { ` `            ``while` `(n % i == ``0``) { ` `                ``// save the digit 'i' that divides 'n' ` `                ``// onto the stack ` `                ``digits.push(i); ` `                ``n = n / i; ` `            ``} ` `        ``} ` ` `  `        ``// if true, then no number 'k' can be formed  ` `        ``if` `(n != ``1``) { ` `            ``return` `-``1``; ` `        ``} ` ` `  `        ``// pop digits from the stack 'digits' ` `        ``// and add them to 'k' ` `        ``long` `k = ``0``; ` `        ``while` `(!digits.empty()) { ` `            ``k = k * ``10` `+ digits.peek(); ` `            ``digits.pop(); ` `        ``} ` ` `  `        ``// required smallest number ` `        ``return` `k; ` `    ``} ` ` `  `// Driver program to test above ` `    ``static` `public` `void` `main(String[] args) { ` `        ``int` `n = ``100``; ` `        ``System.out.println(smallestNumber(n)); ` `    ``} ` `} ` ` `  `/*This code is contributed by PrinciRaj1992*/`

## Python3

 `# Python3 implementation to find smallest  ` `# number k such that the product of digits ` `# of k is equal to n ` `import` `math as mt  ` ` `  `# function to find smallest number k such that ` `# the product of digits of k is equal to n ` `def` `smallestNumber(n): ` ` `  `    ``# if 'n' is a single digit number, then ` `    ``# it is the required number ` `    ``if` `(n >``=` `0` `and` `n <``=` `9``): ` `        ``return` `n ` `     `  `    ``# stack the store the digits ` `    ``digits ``=` `list``() ` `     `  `    ``# repeatedly divide 'n' by the numbers  ` `    ``# from 9 to 2 until all the numbers are  ` `    ``# used or 'n' > 1 ` `    ``for` `i ``in` `range``(``9``,``1``, ``-``1``): ` `     `  `        ``while` `(n ``%` `i ``=``=` `0``): ` `         `  `            ``# save the digit 'i' that  ` `            ``# divides 'n' onto the stack ` `            ``digits.append(i) ` `            ``n ``=` `n ``/``/``i ` `         `  `    ``# if true, then no number 'k'  ` `    ``# can be formed  ` `    ``if` `(n !``=` `1``): ` `        ``return` `-``1` ` `  `    ``# pop digits from the stack 'digits' ` `    ``# and add them to 'k' ` `    ``k ``=` `0` `    ``while` `(``len``(digits) !``=` `0``): ` `     `  `        ``k ``=` `k ``*` `10` `+` `digits[``-``1``] ` `        ``digits.pop() ` `     `  `    ``# required smallest number ` `    ``return` `k ` ` `  `# Driver Code ` `n ``=` `100` `print``(smallestNumber(n))  ` ` `  `# This code is contributed by  ` `# Mohit kumar 29 `

## C#

 `     `  `// C# implementation to find smallest number k such that ` `// the product of digits of k is equal to n ` `using` `System; ` `using` `System.Collections.Generic; ` `public` `class` `GFG { ` `  `  `// function to find smallest number k such that ` `// the product of digits of k is equal to n ` `    ``static` `long` `smallestNumber(``int` `n) { ` `        ``// if 'n' is a single digit number, then ` `        ``// it is the required number ` `        ``if` `(n >= 0 && n <= 9) { ` `            ``return` `n; ` `        ``} ` `  `  `        ``// stack the store the digits ` `        ``Stack<``int``> digits = ``new` `Stack<``int``>(); ` `  `  `        ``// repeatedly divide 'n' by the numbers  ` `        ``// from 9 to 2 until all the numbers are  ` `        ``// used or 'n' > 1 ` `        ``for` `(``int` `i = 9; i >= 2 && n > 1; i--) { ` `            ``while` `(n % i == 0) { ` `                ``// save the digit 'i' that divides 'n' ` `                ``// onto the stack ` `                ``digits.Push(i); ` `                ``n = n / i; ` `            ``} ` `        ``} ` `  `  `        ``// if true, then no number 'k' can be formed  ` `        ``if` `(n != 1) { ` `            ``return` `-1; ` `        ``} ` `  `  `        ``// pop digits from the stack 'digits' ` `        ``// and add them to 'k' ` `        ``long` `k = 0; ` `        ``while` `(digits.Count!=0) { ` `            ``k = k * 10 + digits.Peek(); ` `            ``digits.Pop(); ` `        ``} ` `  `  `        ``// required smallest number ` `        ``return` `k; ` `    ``} ` `  `  `// Driver program to test above ` `    ``static` `public` `void` `Main() { ` `        ``int` `n = 100; ` `        ``Console.Write(smallestNumber(n)); ` `    ``} ` `} ` `  `  `/*This code is contributed by Rajput-Ji*/`

## PHP

 `= 0 && ``\$n` `<= 9) ` `        ``return` `\$n``; ` `     `  `    ``// stack the store the digits ` `    ``\$digits` `= ``array``(); ` `     `  `    ``// repeatedly divide 'n' by the numbers  ` `    ``// from 9 to 2 until all the numbers are  ` `    ``// used or 'n' > 1 ` `    ``for` `(``\$i` `= 9; ``\$i` `>= 2 && ``\$n` `> 1; ``\$i``--) ` `    ``{ ` `        ``while` `(``\$n` `% ``\$i` `== 0) ` `        ``{ ` `            ``// save the digit 'i' that divides 'n' ` `            ``// onto the stack ` `            ``array_push``(``\$digits``,``\$i``); ` `            ``\$n` `=(int)( ``\$n` `/ ``\$i``); ` `        ``} ` `    ``} ` `     `  `    ``// if true, then no number 'k' can be formed  ` `    ``if` `(``\$n` `!= 1) ` `        ``return` `-1; ` ` `  `    ``// pop digits from the stack 'digits' ` `    ``// and add them to 'k' ` `    ``\$k` `= 0; ` `    ``while` `(!``empty``(``\$digits``)) ` `        ``\$k` `= ``\$k` `* 10 + ``array_pop``(``\$digits``); ` `     `  `    ``// required smallest number ` `    ``return` `\$k``; ` `} ` ` `  `    ``// Driver code ` `    ``\$n` `= 100; ` `    ``echo` `smallestNumber(``\$n``); ` ` `  `// This code is contributed by mits ` `?> `

Output:

```455
```

Time Complexity: O(num), where num is the size of the stack.
Space Complexity: O(num), where num is the size of the stack.

We can store the required number k in string for large numbers.

This article is contributed by Ayush Jauhari. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Article Tags :

11

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.