丑数

来源:互联网 发布:人工智能app是什么 编辑:程序博客网 时间:2024/04/30 00:33

  • 时间限制:1秒空间限制:32768K
  • 通过比例:18.37%
  • 最佳记录:0ms|8552K(来自  牛客688826号)

题目描述

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

标准答案:

class Solution {public:int GetUglyNumber_Solution(int index) {if(index<=0) return 0;        int *uglynumbers=new int[index];        uglynumbers[0]=1;        int cur=1;        int *ugly2=uglynumbers;        int *ugly3=uglynumbers;        int *ugly5=uglynumbers;        while(cur<index){                        int minugly=Min(*ugly2*2,*ugly3*3,*ugly5*5);            uglynumbers[cur]=minugly;            while(*ugly2*2<=uglynumbers[cur]) ugly2++;            while(*ugly3*3<=uglynumbers[cur]) ugly3++;            while(*ugly5*5<=uglynumbers[cur]) ugly5++;            cur++;        }        int ret=uglynumbers[cur-1];        delete[] uglynumbers;        return ret;    }    int Min(int n1,int n2,int n3){        return min(min(n1,n2),n3);    }};



一种超时的算法:

class Solution {public:int GetUglyNumber_Solution(int index) {        int n=0;        while(index>0){            ++n;            if(IsUglyNumber(n)) --index;        }        return n;}    bool IsUglyNumber(int n){        if(1==n) return true;        vector<int> decPrime;        bool flag=true;        for(int i=2;i<=n;++i){            while(n!=i){                if(n%i!=0) break;            decPrime.push_back(i);                n=n/i;            }        }                decPrime.push_back(n);                for(int i=0;i<decPrime.size();++i){            if(decPrime[i]!=1&&decPrime[i]!=2&&decPrime[i]!=3&&decPrime[i]!=5){                flag=false;                break;            }        }        return flag;    }    bool IsUgly(int n){        while(n%2==0) n/=2;        while(n%3==0) n/=3;        while(n%5==0) n/=5;        return n==1?true:false;    }};


0 0
原创粉丝点击