Welcome to Subscribe On Youtube
2847. Smallest Number With Given Digit Product
Description
Given a positive integer n
, return a string representing the smallest positive integer such that the product of its digits is equal to n
, or "-1"
if no such number exists.
Example 1:
Input: n = 105 Output: "357" Explanation: 3 * 5 * 7 = 105. It can be shown that 357 is the smallest number with a product of digits equal to 105. So the answer would be "105".
Example 2:
Input: n = 7 Output: "7" Explanation: Since 7 has only one digit, its product of digits would be 7. We will show that 7 is the smallest number with a product of digits equal to 7. Since the product of numbers 1 to 6 is 1 to 6 respectively, so "7" would be the answer.
Example 3:
Input: n = 44 Output: "-1" Explanation: It can be shown that there is no number such that its product of digits is equal to 44. So the answer would be "-1".
Constraints:
1 <= n <= 1018
Solutions
-
class Solution { public String smallestNumber(long n) { int[] cnt = new int[10]; for (int i = 9; i > 1; --i) { while (n % i == 0) { ++cnt[i]; n /= i; } } if (n > 1) { return "-1"; } StringBuilder sb = new StringBuilder(); for (int i = 2; i < 10; ++i) { while (cnt[i] > 0) { sb.append(i); --cnt[i]; } } String ans = sb.toString(); return ans.isEmpty() ? "1" : ans; } }
-
class Solution { public: string smallestNumber(long long n) { int cnt[10]{}; for (int i = 9; i > 1; --i) { while (n % i == 0) { n /= i; ++cnt[i]; } } if (n > 1) { return "-1"; } string ans; for (int i = 2; i < 10; ++i) { ans += string(cnt[i], '0' + i); } return ans == "" ? "1" : ans; } };
-
class Solution: def smallestNumber(self, n: int) -> str: cnt = [0] * 10 for i in range(9, 1, -1): while n % i == 0: n //= i cnt[i] += 1 if n > 1: return "-1" ans = "".join(str(i) * cnt[i] for i in range(2, 10)) return ans if ans else "1"
-
func smallestNumber(n int64) string { cnt := [10]int{} for i := 9; i > 1; i-- { for n%int64(i) == 0 { cnt[i]++ n /= int64(i) } } if n != 1 { return "-1" } sb := &strings.Builder{} for i := 2; i < 10; i++ { for j := 0; j < cnt[i]; j++ { sb.WriteByte(byte(i) + '0') } } ans := sb.String() if len(ans) > 0 { return ans } return "1" }