/
UglyNumber.c
93 lines (75 loc) · 1.24 KB
/
UglyNumber.c
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* 把只包含因子2、3、5的数称作丑数。求按照从小到大的顺序的第1500个
* 丑数。习惯上把1当做第一个丑数
*/
#include <stdio.h>
#include <stdlib.h>
int IsUgly(int num)
{
if (num <= 0)
return 0;
while (num % 2 == 0)
num /= 2;
while (num % 3 == 0)
num /= 3;
while (num % 5 == 0)
num /= 5;
return num == 1 ? 1 : 0;
}
int FindNthUglyNum(int n)
{
int k = 0;
int i = 0;
if (n <= 0)
{
return 0;
}
while (k != n)
{
++i;
if (IsUgly(i))
k++;
}
return i;
}
int Min(int num1, int num2, int num3)
{
int min = (num1 < num2) ? num1 : num2;
min = (min < num3) ? min : num3;
return min;
}
int FindNthUglyNum_2(int index)
{
int ugly;
int *pUgly = NULL;
int next = 1;
int *p2, *p3, *p5;
if (index <= 0)
return 0;
pUgly = (int *)malloc(sizeof(int) * index);
pUgly[0] = 1;
p2 = pUgly;
p3 = pUgly;
p5 = pUgly;
while (next < index)
{
int min = Min(*p2 * 2, *p3 * 3, *p5 * 5);
pUgly[next] = min;
while (*p2 * 2 <= pUgly[next])
++p2;
while (*p3 * 3 <= pUgly[next])
++p3;
while (*p5 * 5 <= pUgly[next])
++p5;
++next;
}
ugly = pUgly[next - 1];
free(pUgly);
return ugly;
}
int main()
{
int ret = FindNthUglyNum_2(10);
printf("%d\n", ret);
return 0;
}