数位之积(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.边界条件容易遗漏,比如图中的情况三