前言:
1.
何为丑数?
丑数,就是只含有2、3、5三个因子的正整数。
2.
如何让判断丑数?
一个数先被2整除,直到不能被2整除,再被3整除,直到不能被3整除,再被5整除,直到不能被5整除,除到最后如果只剩下1则为丑数,否则不为丑数
3.
判断丑数代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| #include <iostream>
using namespace std;
class Solution {
public:
bool isUgly(int num) {
if (num==0) {
return false;
}else if(num==1){
return true;
}else{
int tmp = num;
while (tmp%2 == 0) {
tmp = tmp/2;
}
while (tmp%3 == 0) {
tmp = tmp/3;
}
while (tmp%5 == 0) {
tmp = tmp/5;
}
if (tmp==1) {
return true;
}else{
return false;
}
}
}
};
|
问题要求:
例如1, 2, 3, 4, 5, 6, 8, 9, 10, 12 为前10个丑数,求第n个丑数
做法:
1.
我们可以利用队列来帮助我们解决问题,首先我们需要3个队列q2、q3、q5,这三个队列分别存储能被2、3、5整除的整数;
2.
1为第一个丑数,我们用p来记录当前的丑数,求第n个丑数,则循环n-1次以下操作:首先2*p、3*p、5*p分别插入q2、q3、q5队列,取各个队头元素获取他们之中的最小值,该最小值也是该次循环的丑数,再判断各个队头元素是否与这个最小值相等,如果相等则出队,再将该最小值赋值为p;
3.
循环结束,p就是第n个丑数;
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| #include <iostream>
#include <queue>
using namespace std;
class Solution {
public:
int min1(int a,int b){
return a<b?a:b;
}
int nthUglyNumber(int n) {
if (n<=0) {
return -1;
}else if (n==1) {
return 1;
}else{
queue<int> q2;
queue<int> q3;
queue<int> q5;
int i = 1;
int p = 1;
while (i<n) {
q2.push(p*2);
q3.push(p*3);
q5.push(p*5);
int min2 = q2.front();
int min3 = q3.front();
int min5 = q5.front();
int min = min1(min1(min2, min3), min5);
if (min2==min) {
q2.pop();
}
if (min3==min) {
q3.pop();
}
if (min5==min) {
q5.pop();
}
p = min;
i++;
}
return p;
}
}
};
int main(int argc, const char * argv[]) {
// insert code here...
Solution* s = new Solution();
cout<<s->nthUglyNumber(4)<<endl;
return 0;
}
|