AdamDuncan

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、从1开始的数,逐个判断是不是丑数。直到第N个输出

2、该方法目前还有bug,原因不明,理论上应该能做

每个丑数其实都是由之前的丑数乘2或者乘3或者乘以5得到的

使用一个set容器避免重复,使用一个优先队列存放丑数,每次得到最小的丑数,并且把最小的丑数乘2,乘3,乘以5。这三个结果分别不在set容器中,则放入优先队列和set容器。

得到最小的丑数的次数等于N时,得到结果。

3、使用三个遍历标签i2,i3,i5,分别代表每个数进行*2,乘3乘以5操作。每次得到这三个操作中得到的最小的数

代码三和代码二中的文件操作是为了对比哪一步出现了错误

代码三

#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        //中间过程变量输出到文件
        ofstream out("out3.txt", ios::out); 
          int i2 = 0,i3 = 0,i5 = 0;
          int ret = 0;
          int temp = 1;
          int count = 1;
        vector<int> vec;
        vec.push_back(1);
        out<<1<<endl;
        while (true) 
        {
            if (count >= index)
            {
                ret = temp;
                break;
            }
            temp = min(vec[i2] * 2,min(vec[i3] * 3, vec[i5] * 5));
            out<<temp<<endl; 
            if (temp == vec[i2] * 2)
            {
                i2++;
            }
            if (temp == vec[i3] * 3)
            {
                i3++;
            }
            if (temp == vec[i5] * 5)
            {
                i5++;
            }
            count++;    
            vec.push_back(temp);    
        }
        if (out.is_open())
        {
            out.close();
        }
        return ret;
    }
};
int main()
{
    cout<<Solution().GetUglyNumber_Solution(1500)<<endl;
    return 0;
}

代码二

#include<iostream>
#include<queue>
#include<set> 
#include<fstream>
//通过优先队列来得到丑数 
using namespace std;
//用来构造优先队列最小堆 
struct cmp {
    public:
    bool operator()(int a,int b)
    {
        if (a < b)
        {
            return false;
        }
        return true;
    } 
};

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        //中间过程信息打印到文件中
        ofstream out;
        out.open("out2.txt",ios::out); 
        priority_queue<int,vector<int>, cmp> que;
        //去除优先队列中的重复元素 
        set<int> newSet;
        //初始情况下 
        que.push(1);
        newSet.insert(1);
        int count = 0;
        int ret = 0;
        int temp = 0;
        while (true)
        {
            temp = que.top();
            
            out<<temp<<endl;
            
            //如果没有寻找到这个值,说明还没有被加入过,所以加入 
            count++;
            if (count >= index)
            {
                ret = temp;
                break;
            }
            //丑数肯定是之前的丑数*2,*3,*5构成的 
            if (newSet.find(temp * 2) == newSet.end())
            {
                que.push(temp * 2);
                newSet.insert(temp * 2);
            } 
            if (newSet.find(temp * 3) == newSet.end())
            {
                que.push(temp * 3);
                newSet.insert(temp * 3);
            }
            if (newSet.find(temp * 5) == newSet.end())
            {
                que.push(temp * 5);
                newSet.insert(temp * 5);
            }
            que.pop();
            if (que.empty())
            {
                break;
            }
        }
        if (out.is_open())
        {
            out.close();
        }
        return ret;
    }
};
int main()
{
    cout<<Solution().GetUglyNumber_Solution(1500)<<endl;
    return 0;
}

代码一:

#include<iostream>
using namespace std;
bool isUglyNumber(int number)
{
    while (number % 5 == 0)
    {
        number /= 5;
    }
    while (number % 3 == 0)
    {
        number /= 3;
    }
    while (number % 2 == 0)
    {
        number /= 2;
    }
    if (number == 1)
    {
        return true;
    } else {
        return false;
    }
}
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        int count = 1;
        int ret = 1;
        int temp = 2;
        while (count < index)
        {
            if (isUglyNumber(temp))
            {
                count++;
            }
            if (count == index)
            {
                ret = temp;
            }
            temp++;
        }
        return ret;
    }
};
int main()
{
    cout<<Solution().GetUglyNumber_Solution(7)<<endl;
    return 0;
}

 

posted on 2017-11-29 18:04  AdamDuncan  阅读(1020)  评论(0编辑  收藏  举报