面试代码题(vivo)数位之积

1,632 阅读1分钟

描述

输入一个正整数n,输出一个最小正整数m,使得m的各位乘积等于n,若不存在,则返回-1。

Example 1:

Input: 100
Output: 455

Example 2:

Input: 36
Output: 49

思路

  1. 当输入的数据n<10时,可以直接返回10+n;
  2. 当输入的数据>10时,需要分析求小于10的所有因子,而且要满足因子的个数越少越好,并且小的因子应该放在前面。当用10以内的所有因子试过之后,如果这些因子乘积不等于输入数据n,说明不存在最小正整数m,应该返回-1。
public class Solution{
    public static void main(String[] args) {
        int m =fun(getString());
	System.out.println(m);
    }
    //输入函数
    public static Integer getString(){
	return Integer.parseInt((new Scanner(System.in)).nextLine());
    }
    //处理函数
    public static int fun(int n){
        int temp = n;String k ="";
	if(temp <= 9){
	    return 10 + temp;
	}
        //由大到小试因子
	for(int i = 9;i >= 2;){
            //当前数字为因子时多次进行除操作,否则换下一个因子
	    if(temp%i == 0){
	        k = k + i;
	        temp = temp/i;
		continue;
	    }else
		i--;
        }
        //对结果进行验证
        int n2 = 1;
        for(int j = 0; j<k.length(); j++){
            n2 = n2*Integer.parseInt(k.charAt(j)+"");
        }
        //结果不符合时
        if(n2 != n){
            return -1;
        }
        //按从小到大的顺序排列因子
        String out = new String();
        for(int i = k.length()-1; i >= 0; i--){
            out = out + k.charAt(i);
        }
        return Integer.parseInt(out);
    }
}

最小整数m的构造具有迷惑性,要注意最少的因子和有小到大的排列顺序。

机试时未能答出,无思路。