【牛客网编程题】数位之积(vivo2020届春招编程题)

数位之积(vivo2020届春招编程题)

本题链接

【题目描述】

现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 … …)之乘积等于n,若不存在则输出 -1。

示例1
输入

36

输出

49

示例2
输入

100

输出

455

【题意分析】
本题题意比较明了,是一个最优解问题,有一定难度,逻辑思路比较复杂。
【解题思路】
条件分析
1.按照返回值m的要求,每一次只能放一位,所以每次放的数据i范围为9>=...>= 2
2…如果这个数是素数或者它的因数是一个素数,则循环中n/i不可能等于1,否则它 n一 定满足n == 1,有点绕,画个图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以只要满足情况1,其最后满足n == 1
解题步骤:
1.首先要将数据一个个放入m中,使用整形并不好操作,我们可以使用字符串来完成,因为字符串+=操作更加方便。
2.我们求最小值m,并不好求,我们可以传换思想,因为循环for(int i = 9;i >=2;i--)从最大值 i=9来进行遍历,则满足条件的i一定是当前n的最大除数,用字符串使用str += ('0' + i);将i添加,注意这里要添加字符‘i’,所以需要将整数转字符
3.循环完成后,逆置字符串就得到了m的最小值
4.这步很重要,往往被忽略,我们需要判断最后n是否等于1(看图),若n==1则是情况1,输出stoi(str)注意要使用字符串转整形函数stoi();若不满足n==1,则是情况2和情况3,直接return -1
【代码如下】

class Solution {
public:
 
    int solution(int n) {
        string str;
        for(int i = 9;i >=2;i--)
        {
            while(n % i == 0)
            {
                str += ('0' + i);
                n /= i;
            }
        }
        reverse(str.begin(),str.end());
        return n == 1 ? stoi(str) : -1;
    }
};

【本题总结】
1.代码简单但思路较为复杂,不易理解
2.使用到整型和字符型相互转换,还有逆置函数reverse(str.begin(),str.end());其头文件为#include<algorithm>
3.边界条件容易遗漏,比如图中的情况三

发布了38 篇原创文章 · 获赞 141 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43676757/article/details/105380430