625. Minimum Factorization

Problem statement

Given a positive integer a, find the smallest positive integer b whose multiplication of each digit equals to a.

If there is no answer or the answer is not fit in 32-bit signed integer, then return 0.

Example 1
Input:

48 

Output:

68

Example 2
Input:

15

Output:

35

Solution

This is the third problem for weekly contest 37. Initially, I thought it is a DFS problem. Actually, it is much easier. Although it is tagged with recursion in leetcode, I prefer it is a pure math.

Since the input number should only contains the factors which are less than 10. We loop from 9 to 2, to divide the input number, until it is not divisible by any number in [2, 9].

Suppose the input number is a, general idea is as following:

  • Loop i from 9 to 2.
  • In each loop, if a is divisible by i, update the min factorization value and a. Goes to next loop until a is not divisible by i
  • After exiting the loop,
    1. if a < 2, means all it`s factors are single digit number, return the value(if it is in the range),
    2. Otherwise, it means there is at least one factor, that is greater than 9, return 0. 

Time complexity is O(8loga), space complexity is O(1).

class Solution {
public:
    int smallestFactorization(int a) {
        if(a < 2){
            return a;
        }
        long min_factorization = 0;
        long mul = 1;
        for(int i = 9; i >= 2; i--){
            while(a % i == 0){
                min_factorization += mul * i;
                mul *= 10;
                a /= i;
            }
        }
        return (a < 2 && min_factorization < INT_MAX) ? min_factorization : 0;
    }
};

 

posted @ 2017-06-21 10:18  蓝色地中海  阅读(153)  评论(0编辑  收藏  举报