📌  相关文章
📜  最小数k,以使k的数字乘积等于n

📅  最后修改于: 2021-04-28 18:20:29             🧑  作者: Mango

给定一个非负数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,直到无法再对其进行除法或从92的数字列表完成。同样,在除法过程中,将每个数字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存储在字符串中。