给定一个非负数n 。问题是找到最小的数k ,使k的数字乘积等于n 。如果无法形成这样的数字k,则打印“ -1”。
例子:
Input : 100
Output : 455
4*5*5 = 100 and 455 is the
smallest possible number.
Input : 26
Output : -1
资料来源:在Amazon采访中问
方法:对于每个i = 9到2,将n反复除以i,直到无法再对其进行除法或从9到2的数字列表完成。同样,在除法过程中,将每个数字i推入将n完全除法的堆栈中。完成上述过程后,检查n == 1是否成立。如果不是,则打印“ -1”,否则使用堆栈中的数字形成数字k ,其中包含的数字的顺序与从堆栈中弹出的顺序相同。
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 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 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.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
?>
输出:
455
时间复杂度: O(num),其中num是堆栈的大小。
空间复杂度: O(num),其中num是堆栈的大小。
对于大数,我们可以将所需的数k存储在字符串中。