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; }