首页 > 试题广场 >

数位之积

[编程题]数位之积
  • 热度指数:7283 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 ... ...)之乘积等于n,若不存在则输出 -1。
示例1

输入

36

输出

49
示例2

输入

100

输出

455
其实只要看能否被2,3,5,7四个质数分解就行,不能就是-1,能的话,尽量保留小的质数,让大的质数相乘。
发表于 2020-06-06 15:09:50 回复(0)
分析一下这道题: 
当 n < 10 时,比如说n == 4,符合条件的数就是14;即return (10 + n);
当 n >= 10 时,要将 n 分解为各个数位的乘积,范围是2-9,并且要求位数尽可能少,而且越大的数位往低位放。
综上,可以写出如下代码:
/**
     * 输入一个整形数值,返回一个整形值
     * @param n int整型 n>9
     * @return int整型
     */
class Solution {
public:
    int solution(int n) {
                // 因为题目限制了输入参数n>9,所以不需要进行判断

        int res = 0, base = 1;
        for(int i = 9; i > 1; i--) {
            while(n % i == 0) {
                res += (i * base);
                base *= 10;
                n /= i;
            }
        }
        return n > 1 ? -1 : res;
    }
};


    
发表于 2020-06-04 15:43:40 回复(1)
import java.util.*;


public class Solution {
    public int solution (int n) {
        String ans = "";
         for(int i = 9;i >= 2;i--){
                while(n!=1&&n%i==0){
                    ans = i+ans;
                    n/=i;
                }
                if(n==1) break;
        }
        if(n!=1) return -1;
        int res = Integer.parseInt(ans);
        return res;
    }
}
最小数,贪心求除数即可
发表于 2020-09-11 16:03:48 回复(0)
关键思想就是要从大到小遍历,因为要保证输出的位数越少越好,所以用越大的因子会用越少的位数除完,而相同的位数内,高位的数字越大,低位的就越小,倒序输出时的数就越小。
class Solution:
    def solution(self , n ):
        # write code here
        def search(n,temp):
            for i in range(9,1,-1):
                res = n/i
                if n%i==0:
                    temp = temp*10+i
                    if res==1:
                        b= 0
                        while temp !=0:
                            a = temp%10
                            b= b*10+a
                            temp = temp//10
                        return b

                    else:
                        return search(res,temp)
        temp=0
        return search(n,temp)

发表于 2020-06-06 20:16:16 回复(0)

[编程题]数位之积
对于小于10的数n,输出1n。
对于大于10的数,需要分解为若干个个位数之积,数字的个数尽可能少。这个数字可以分解为以9,8,...,2的因子之积。然后从小到大输出即可。
我也写了第三题的答案,[编程题]vivo智能手机产能 只需两行 数学解法

class Solution {
public:
    /**
     * 输入一个整形数值,返回一个整形值
     * @param n int整型 n>9
     * @return int整型
     */
    int solution(int n) {
        // write code here
        if (n < 10) return 10 + n;
        int res = 0, base = 1;
        for (int i = 9; i > 1; i--) {
            while (n % i == 0) {
                res += i * base;
                base*=10;
                n /= i;
            }
        }
        if (n > 1) return -1;
        else return res;
    }
};
发表于 2020-04-06 13:06:44 回复(17)
# 输入一个整形数值,返回一个整形值
(3783)# @param n int整型 n>9
# @return int整型
(3784)# 递归迭代 9-2 判断是否取余等于0,然后返回统计好的数 
class Solution:
    def solution(self , n ):
        # write code here
        r = self.Func(n)
        if r>0:
            return r
        return -1
    def Func(self,n):
        if n <10 :
            return n
        for i in range(9,1,-1):
            if n%i == 0 :
                return self.Func(n/i)*10+i;
        return -1

发表于 2020-03-26 22:16:28 回复(2)
语言:Java 运行时间: 48 ms 占用内存:12140K
使用for循环取余,然后递归,接着用列表,排序好转化成字符串输出。我的有点乱😀😀😀😀
package com.pass;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;

public class Vivo2 {
	static int num = 0;
	static LinkedList numList = new LinkedList();
	static boolean flag = true;
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		num = scan.nextInt();
		if(num > 0){
			func(num);
			output();
		}else{
			System.out.print("0");//表示输出零
		}
	}
	private static void output() {
		if(numList.size() == 0){
			System.out.print("-1");//表示不存在
		}else if(flag == false){
			System.out.print("-1");//表示不存在
		}else{
			Collections.sort(numList);//列表或数组可以这样直接排序
			String result = numList.toString();
		    for (int j = 0; j < numList.size(); j++) {
		        System.out.print(numList.get(j));
		    }
		}
	}
	private static int func(int num2) {
		if(num2 < 10){
			addNum(num2);
			return 0;
		}else{
			for (int i = 9; i > 1; i--) {//2,3,4,5,6,7,8,9
				if((num2 % i) == 0){
					addNum(i);
					func(num2/i);
					return 0;//提前终止
				}
			}
			flag = false;//表示num2为大于10的素数,如11,13
			return -1;//只是错误提示,这里没有作用
		}
	}
	private static void addNum(int num2) {
		numList.addLast(num2);
	}
}


发表于 2020-04-03 20:48:55 回复(0)
import java.util.*;


public class Solution {
    /**
     * 输入一个整形数值,返回一个整形值
     * @param n int整型 n>9
     * @return int整型
     */
    public int solution (int n) {
        String ans = "";
        for(int i = 9;i > 1;i--){
            while(n % i == 0){
                ans = i+ans;
                n/=i;
            }            
        }
        if(n > 1){
            return -1;
        }else{
            int res = Integer.parseInt(ans);
            return res;
        }
        
        
    }
}
发表于 2022-09-09 22:09:17 回复(0)
#评论里的大佬复刻版
class Solution:
    def solution(self,n):
        if n < 10:
            return 10 + n 
        else:
            res,base = 0,1
            for i in range(9,1,-1):#从9开始减,则个位肯定是最大的,后面逐渐递减,减到2(包括2)
                while(n % i == 0):
                    res = res + i * base
                    base = base *10
                    n = n / i
        
        if n > 1:#
            return -1
        else:
            return res
        
n = int(input())
s = Solution()
print(s.solution(n))   

发表于 2022-03-05 01:05:46 回复(0)
python 67ms
class Solution:
    dig = [9, 8, 7, 6, 5, 4, 3, 2]
    n = 11
    res = 0
    out = []
    su = False

    def f1(self, n):
        # global mul,su
        for i in self.dig:
            if n % i == 0:
                self.out.append(i)
                self.f1(n / i)
                return self.out
        if n > 9:
            self.su = True

    def solution(self, n):
        if n < 10:
            print(10 + n)
        else:
            outt = self.f1(n)
            if self.su:
                self.res = -1
            else:
                for j in range(len(outt)):

                    self.res =self.res+ 10 ** j * outt[j]
            return self.res


发表于 2021-11-12 10:44:26 回复(0)
function solution( n ) {
    // write code here
    let ans='';
    while(n!==1){
        let flag = false;
        for(let i=9; i>1; i--){
            if(n%i===0){
                ans = i+''+ans;
                n/=i;
                flag = true;
                break;
            }
        }
        if(!flag) return -1;
    }
    if(ans.length===0) return -1;
    else return Number(ans);
}


发表于 2021-09-21 23:33:07 回复(0)
import java.util.*;
public class Solution {
    public int solution (int n) {
        int m = 0;
        for(int i=9,j=0;i>1;i--){ // 数值从9开始,从大到小
            if(n%i == 0){         // 找到其中一位商
                n /= i;
                m += (int)(i*Math.pow(10, j));
                i++;              // 有可能会有重复的数,继续判断
                j++;
            }
        }
        if(n == 1){
            return m;
        }else{
            return -1;
        }
    }
}

发表于 2021-09-20 23:02:00 回复(0)
class Solution {
public:
    /**
     * 输入一个整形数值,返回一个整形值
     * @param n int整型 n>9
     * @return int整型
     */
    int solution(int n) {
        multiset<int,greater<int>> s;
        for(int i = 9; i >= 2; i--){
            while(n % i == 0){
                s.emplace(i);
                n /= i;
            }
        }
        if(n != 1)
            return -1;
        int res = 0;
        int tmp = 1;
        for(int x : s){
            res += x * tmp;
            tmp *= 10;
        }// write code here
        return res;
    }
};


发表于 2021-09-16 12:22:12 回复(0)
import java.util.*;


    public class Solution {
        /**
         * 输入一个整形数值,返回一个整形值
         * @param n int整型 n>9
         * @return int整型
         */
        public static void main(String[] args) {
            Solution s = new Solution();
            System.out.println(s.solution(108));
        }
        //为什么要用long呢 因为按照从大到小搜索会得到例如9988776621
        //正确答案为1266778899,但是上面那个数已经大于integer表示范围了
        long res=Long.MAX_VALUE;
        long temp=0;
        public int solution (int n) {
            // write code here
            dfs(n,1l,9);
            //System.out.println(res);
            if(res==Long.MAX_VALUE)return -1;

            StringBuilder sb=new StringBuilder(Long.toString(res));
           // System.out.println(sb.toString());
            return Integer.parseInt(sb.reverse().toString());

        }
        private void  dfs(int n,long sum,int index){
            if(sum>=n){
                if(sum==n&&res>temp){
                    res=temp;
                }
                return;
            }
            if(res!=Long.MAX_VALUE)return;
            for(int i=index;i>=2;i--){

                temp=temp*10+i;
                dfs(n,sum*i,i);
                temp=(temp-i)/10;
            }
        }
    }
dfs 从9-->2搜索,reverse便是答案
发表于 2021-05-19 21:31:03 回复(0)
人头像
好像没有个位数的样例?
#
# 输入一个整形数值,返回一个整形值
# @param n int整型 n>9
# @return int整型
#
class Solution:
    def solution(self , n ):
        s=''
        i=9
        while n!=1:
            while i>1:
                if n%i==0:
                    s+=str(i)
                    n=n//i
                    break
                else: i-=1
            if i==1: return -1
        return int(s[::-1])

发表于 2020-09-26 21:50:11 回复(0)
菜鸡JS题解
其实有一个特别的情况,就是几个数最大的乘积不会超过数字的数量(如:9*9*9==729)
因此返回-1可以通过获取的公因子数量来判断
由于要取最小,那么最低位的公因子应该最大,所以每次从取到的当前最大一个开始搜索就可以节省时间(如:最大取5,则从5开始搜索)
function solution( n ) {
    // write code here
    var tmp = n;
    var res = new Array();
    for(let i=9;i>1;i--)
        {
            if(tmp%i == 0)
            {
                res.unshift(i);
                tmp = tmp/i;
                i = parseInt(res[res.length-1])+1;
            }
        }
    if((n+'').length>res.length)
        return -1;
    else
        return res.join('');
}

发表于 2020-08-31 15:26:19 回复(0)
有没有JS的答案啊,这个输入输出怎么搞?
  * @param n int整型 n>9
  * @return int整型
  */

function solution( n ) {
    // write code here
    let func=function(n){
        if(n<10) return 10+n
        let res=0,base=1
        for(let i=9;i>1;i--){
            while(n % i==0){
                res+=i*base
                base=base*10
                n=n/i
            }
        }
        if(n>1){
            return -1
        }else{
            return res
        }
    }
    var readline=require('readline')
    const r1=readline.createInterface({
        input:process.stdin,
        output:process.stdout
    })
    r1.on('line',function(line){
        var tokens=parseInt(line)
        console.log(func(tokens))
    })
}
module.exports = {
    solution : solution
};


发表于 2020-08-17 17:56:35 回复(2)
int solution(int n) {
		int sum = 0;
		int base = 1;  
		int tmp;    //存储被除数
		
		while (n > 1)
		{
			int flag = 0;  //一个数不能被2-9除, 直接return -1;
			for (int i = 9; i >= 2; i--)
			{
				if (n % i == 0) {
					tmp = i;
					sum = sum + base * tmp;
					base *= 10;
					flag = 1;   //该数可以被整除
					break;
				}
			}
			if (flag == 0) return -1;
			n = n / tmp;
		}
	
		return sum;
	}

发表于 2020-08-16 07:44:45 回复(0)
n = int(input())
res = 0
base = 1
lis = [9,8,7,6,5,4,3,2]
if n < 10:
    res = 10 + n
else:
    for i in lis:
        while (n%i == 0):
            res += i*base
            base = base*10
            n = n/i
    if n > 1:
        res = -1
print(res)

发表于 2020-07-09 16:53:00 回复(0)
import java.util.*;


public class Solution {
    /**
     * 输入一个整形数值,返回一个整形值
     * @param n int整型 n>9
     * @return int整型
     */
    public int solution (int n) {
        // write code here
        if(n<10)
            return 10+n;
        else{
            int m=0,base=1;
            while (n>9) {
                int i;
                for (i = 9; i > 1; i--) {
                    if (n % i == 0) {//能被整除
                        m=m+i*base;
                        base=base*10;
                        n=n/i;
                        break;
                    }
                }
                if(n>9&&i==1) //可能是一个不能被2-9整除的数 例如13
                    break;
            }
            if(n<=9){
                m=m+n*base;  //加上位数最高的那位
                return m;
            }else
                return -1;
        }
    }
}


发表于 2020-06-06 19:41:50 回复(0)