vivo2020届春季校园招聘在线编程考试 [编程题]数位之积 C++实现

[编程题]数位之积
时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

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

输入例子1:
36

输出例子1:
49

输入例子2:
100

输出例子2:
455

暴力求解只能满足一半的样例,之前做可以满足百分之70的样例,上网学习了下两篇大佛的代码参照如下
1:http://www.luyixian.cn/news_show_317689.aspx
2:https://www.cnblogs.com/XT-xutao/p/12596299.html
算法思路学习总结:因为题干是找出最小的m各位之积等于n,可以逆向的想出因式分解n 并且 将因子较大的数放在低位,即可求解。不得不说,网上的代码真是让人虎躯一震。还得继续努力学习呀。

#include<iostream>
using namespace std;

int solve(int n)
{
    if(n<10)
    {
        return n;
    }
    for (int i = 9; i > 1;--i)
    {
        if(n%i==0)
        {
            return solve(n / i) * 10 + i;
        }
    }
    return -1;
}
int fun(int n)
{
    int sum = solve(n);
    if(sum>0)
    {
        return sum;
    }

    return -1;
}
int main()
{
    cout << fun(100);
    return 0;
}

第二段代码也是在模仿第一段代码,在学习的过程中,看了第二段代码才能理解第一段代码的意思,(先看的第二段发现有点问题,实际上是自己写switch时每个case忘记加break了导致逻辑上面有一点bug才继续找资料中安到的第一段代码)因为代码给的都是java代码,所以将java代码转成c++代码还学习到了sstream流的用法,再次尤其感谢上述两个博客的博主。

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int fun(int n)
{
    int a[10] = {0};
    for (int i = 2;;++i)
    {
        if(n==1)
        {
            break;
        }
        if(i>9)
        {
            return -1;
        }
        if(n%i==0)
        {
            a[i]++;
            n=n / i;
            i--;
        }
    }
    string s1 = "";
    for (int i = 9; i > 0;--i)
    {
        while(a[i]>0)
        {
            string s2;
            stringstream s3;
            s3 << i;
            s3 >> s2;
            s1 =  s2+ s1;
            a[i]--;
        }
        switch(i)
        {
            case 9:
                while(a[3]>=2)
                {
                    s1 = "9" + s1;
                    a[3] -= 2;
                }
                break;
            case 8:
                while(a[2]>=3)
                {
                    s1 = "8" + s1;
                    a[2] -= 3;
                }
                while(a[2]>0&&a[4]>0)
                {
                    s1 = "8" + s1;
                    a[2]--;
                    a[4]--;
                }
                break;
            case 6:
                while(a[2]>0&&a[3]>0)
                {
                    s1 = "6" + s1;
                    a[2]--;
                    a[3]--;
                }
                break;
            case 4:
                while(a[2]>=2)
                {
                    s1 = "4" + s1;
                    a[2] -= 2;
                }
                break;
        }
    }
    stringstream ss;
    ss << s1;
    int num = 0;
    ss >> num;
    return num;
}
int main()
{
    cout<<fun(100);
    return 0;
}

思路很奇妙,感谢二位博主。如有侵权,请联系我予以删除此文。
启发来源
1:http://www.luyixian.cn/news_show_317689.aspx
2:https://www.cnblogs.com/XT-xutao/p/12596299.html

发布了16 篇原创文章 · 获赞 3 · 访问量 520

猜你喜欢

转载自blog.csdn.net/weixin_43381566/article/details/105463969