zoukankan      html  css  js  c++  java
  • 【转载】丑数humble numbers

    转载地址:http://blog.csdn.net/qwerty_xk/article/details/12749961

    题:只有2 3 5 这三个因子的数,求第1500个   设1为第一个丑数,求第1500个丑数

    解法:

    1 简单的暴力搜索,对每个数进行因子判别,直到搜到第1500个

    评价:耗时 不可取

    2 将得到的数保存在一个数组中,按从小到大的顺序进行存放,对该数组前面的数分别乘以2 3 5,每乘一个因子,先乘到刚好大于该数组最大的值,然后break

    进行下一个因子相乘  ,得到三个数,比较得到这三个数中的最小值,push进当前数组最后。

    这里可以用三个下标来分别保存2 3 5 在数组中开始相乘的起始下标位置,就避免了每次都从数组的开头开始相乘,每次更新的依据为:上面三个数哪个最小,对应的那个因子

    的下标进行更新

        #include<iostream>  
        #include<vector>  
        using namespace std;  
          
        int min3(int a,int b,int c)  
        {  
            int tmp=(a<b?a:b);  
            return (tmp<c?tmp:c);  
        }  
        int main()  
        {  
            vector<int> uglyNum;  
            uglyNum.push_back(1);  //初始只有1在数组中  
            int t2=0,t3=0,t5=0; //每个因子开始相乘的下标位置  
            int i,j,k;  
            while(uglyNum.size()!=1500)  
            {  
                int m2,m3,m5;  //保存每个因子得到的值  
                for(i=t2;i<uglyNum.size();i++)  
                    if(2*uglyNum[i]>uglyNum.back())  
                    {  
                        m2=2*uglyNum[i];  
                        break;  
                    }  
                for(j=t3;j<uglyNum.size();j++)  
                    if(3*uglyNum[j]>uglyNum.back())  
                    {  
                        m3=3*uglyNum[j];  
                        break;  
                    }  
                for(k=t5;k<uglyNum.size();k++)  
                    if(5*uglyNum[k]>uglyNum.back())  
                    {  
                        m5=5*uglyNum[k];  
                        break;  
                    }  
                int tmp = min3(m2,m3,m5);  
                uglyNum.push_back(tmp);  
                if(tmp==m2)  
                    t2=i+1;  //下标位置进行更新  
                if(tmp==m3)  
                    t3=j+1;  
                if(tmp==m5)  
                    t5=k+1;  
            }  
            for(int i=0;i<uglyNum.size();i++)  
                cout<<uglyNum[i]<<" ";  
            cout<<endl;  
            return 0;  
        }  
    

     运行得到的值为 : 859963392 

  • 相关阅读:
    java map的遍历的方法
    .NetTiers使用以及介绍
    Visual Studio使用技巧(转)
    TSQL日期处理相关
    Delphi项目开发和Delphi学习笔记索引
    关于泛型的查找方式
    Delphi语言学习1Program和Unit
    很高兴来到园子里
    Thread.Join()用法的理解
    VS2005 常用快捷键(转)
  • 原文地址:https://www.cnblogs.com/yspworld/p/4730107.html
Copyright © 2011-2022 走看看