Open in App
Not now

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

• Difficulty Level : Medium
• Last Updated : 28 Mar, 2023

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
Explanation: 4*5*5 = 100 and 455 is the
smallest possible number.

Input : 26
Output : -1```

Recommended Practice

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` `?>`

Javascript

 ``

Output

`455`

Time Complexity: O(log N)
Space Complexity: O(log N)

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

Also, the above approach can be space optimized if we store our answer directly in a string and return the reverse of it as the final answer.

C++

 `#include ` `using` `namespace` `std;` `typedef` `long` `long` `ll;`   `string getSmallest(ll N) {` `    `  `    ``string ans;` `    `  `    ``for``(``int` `i=9;i>=2 && N>1;i--)` `    ``{` `        ``while``(N%i==0)` `        ``{` `            ``ans.push_back(i+48);` `            ``N/=i;` `        ``}` `    ``}` `    `  `    ``if``(N!=1)` `    ``return` `"-1"``;` `    ``else` `if``(ans.length()==0)` `    ``return` `"1"``;` `    `  `    ``reverse(ans.begin(),ans.end());` `    `  `    ``return` `ans;` `    ``}` `    `  `// driver's code` `int` `main()` `{` `    ``ll N=100;` `    ``cout<

Java

 `import` `java.util.*;`   `public` `class` `Main {` `    ``public` `static` `String getSmallest(``long` `N) {` `        ``String ans = ``""``;` `        ``for` `(``int` `i = ``9``; i >= ``2` `&& N > ``1``; i--) {` `            ``while` `(N % i == ``0``) {` `                ``ans += (``char``)(i + ``'0'``);` `                ``N /= i;` `            ``}` `        ``}` `        ``if` `(N != ``1``) {` `            ``return` `"-1"``;` `        ``} ``else` `if` `(ans.length() == ``0``) {` `            ``return` `"1"``;` `        ``}` `        ``return` `new` `StringBuilder(ans).reverse().toString();` `    ``}`   `    ``public` `static` `void` `main(String[] args) {` `        ``long` `N = ``100``;` `        ``System.out.println(getSmallest(N));` `    ``}` `}`

Python3

 `def` `getSmallest(N):` `    ``ans ``=` `""` `    `  `    ``for` `i ``in` `range``(``9``, ``1``, ``-``1``):` `        ``while` `N > ``1` `and` `N ``%` `i ``=``=` `0``:` `            ``ans ``+``=` `str``(i)` `            ``N ``/``/``=` `i` `    `  `    ``if` `N !``=` `1``:` `        ``return` `"-1"` `    ``elif` `len``(ans) ``=``=` `0``:` `        ``return` `"1"` `    `  `    ``return` `ans[::``-``1``]`   `# driver's code` `if` `__name__ ``=``=` `'__main__'``:` `    ``N ``=` `100` `    ``print``(getSmallest(N))`

C#

 `using` `System;`   `public` `class` `Program` `{` `  ``static` `string` `GetSmallest(``int` `N)` `  ``{` `    ``string` `ans = ``""``;`   `    ``for` `(``int` `i = 9; i > 1; i--)` `    ``{` `      ``while` `(N > 1 && N % i == 0)` `      ``{` `        ``ans += i.ToString();` `        ``N /= i;` `      ``}` `    ``}`   `    ``if` `(N != 1)` `    ``{` `      ``return` `"-1"``;` `    ``}` `    ``else` `if` `(ans.Length == 0)` `    ``{` `      ``return` `"1"``;` `    ``}`   `    ``char``[] charArray = ans.ToCharArray();` `    ``Array.Reverse(charArray);` `    ``return` `new` `string``(charArray);` `  ``}` `  `  `  ``// driver's code` `  ``public` `static` `void` `Main()` `  ``{` `    ``int` `N = 100;` `    ``Console.WriteLine(GetSmallest(N));` `  ``}` `}`   `// this code is contributed by shivhack999`

Javascript

 `function` `getSmallest(N) {` `  ``let ans = ``""``;`   `  ``for` `(let i = 9; i > 1; i--) {` `    ``while` `(N > 1 && N % i === 0) {` `      ``ans += i.toString();` `      ``N /= i;` `    ``}` `  ``}`   `  ``if` `(N !== 1) {` `    ``return` `"-1"``;` `  ``} ``else` `if` `(ans.length === 0) {` `    ``return` `"1"``;` `  ``}`   `  ``return` `ans.split(``""``).reverse().join(``""``);` `}`   `// driver's code` `const N = 100;` `console.log(getSmallest(N));`

Output

`455`

Time Complexity: O(log N)

Auxiliary Space: O(1)

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