• 求第n个丑数


    参考http://www.cppblog.com/zenliang/articles/131094.html

    什么是因子:因子*因子=乘积数
    如果一个数是丑数,那么这个数是2,3,5的乘积的结果。比如:8=2*2*2;10=2*5;30=2*3*5;
    换句话就是丑数能除以2,3,5直到最后的结果等于1,即:
    15/3=5;
    5/5=1;

    诺西笔试最后一道题,题意:
    把只包含质因子2、3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数。
    写一个高效算法,返回第n个丑数。

    最普通(也最耗时)的做法是从1开始遍历,然后判断这个数的因式分解中只包含2,3,5,满足则找到了一个,一直找下去,直到第n个被找出!测试了一下,找第1500个丑数耗时40秒!

    分析:假设数组ugly[N]中存放不断产生的丑数,初始只有一个丑数ugly[0]=1,由此出发,下一个丑数由因子2,3,5竞争产生,得到ugly[0]*2, ugly[0]*3, ugly[0]*5, 显然最小的那个数是新的丑数,所以第2个丑数为ugly[1]=2,开始新一轮的竞争,由于上一轮竞争中,因子2获胜,这时因子2应该乘以ugly[1]才显得公平,得到ugly[1]*2,ugly[0]*3,ugly[0]*5, 因子3获胜,ugly[2]=3,同理,下次竞争时因子3应该乘以ugly[1],即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5获胜,得到ugly[3]=5,重复这个过程,直到第n个丑数产生。总之:每次竞争中有一个(也可能是两个)因子胜出,下一次竞争中 胜出的因子就应该加大惩罚!

    程序如下所示(只要把程序中的因子改一下就可以得到新的题目),耗时忽略不计:
    运行结果:第1500个丑数:859963392, 第1691个丑数2 125 764 000,第1692个丑数就越界了。
    int表示的最大整数是2,147,483,647,可由std::cout<<(std::numeric_limits<int>::max)()<<" ";给出!

    public int GetUglyNumber_Solution(int index) {
    if(index<=0){
    return 0;
    }
    ArrayList<Integer> arr=new ArrayList<>();
    arr.add(1);
    int index2=0;
    int index3=0;
    int index5=0;
    int totalCount=1;
    int min=0;
    while (totalCount<index){
    min= getMin(2*arr.get(index2),3*arr.get(index3),5*arr.get(index5));
    if(min==2*arr.get(index2)){
    index2++;
    }
    if(min==3*arr.get(index3)){
    index3++;
    }
    if(min==5*arr.get(index5)){
    index5++;
    }
    arr.add(min);
    totalCount++;
    }
    return arr.get(index-1);
    }

    private int getMin(int a, int b, int c){
    int temp=a<b?a:b;
    int min=temp<c?temp:c;
    return min;
    }

  • 相关阅读:
    Linux环境下安装jdk1.8(CentOS7)
    MySQL创建外键报错ERROR 3780 (HY000): Referencing column ‘user_id’ and referenced column ‘id’ in foreign key constraint ‘fk_user_id’ are incompatible.
    scrapy框架的使用
    开源《热血传奇》服务端引擎(C#编写),可以顺利进行游戏(更新编译和部署教程)
    记录一下今天刚开通的博客
    Sql Server 2005中还原整个数据库重命名问题
    第一次学开车
    转载:c#与ASP.NET中DateTime.Now函数详解
    winform进度条收藏
    今天新注册的,庆祝一下
  • 原文地址:https://www.cnblogs.com/lijingran/p/8980929.html
Copyright © 2020-2023  润新知