剑指Offer32 丑数

 1 /*************************************************************************
 2     > File Name: 32_UglyNumber.c
 3     > Author: Juntaran
 4     > Mail: JuntaranMail@gmail.com
 5     > Created Time: 2016年09月02日 星期五 12时29分59秒
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 #include <malloc.h>
10 
11 int isUgly(int number)
12 {
13     while (number % 2 == 0)
14         number /= 2;
15     while (number % 3 == 0)
16         number /= 3;
17     while (number % 5 == 0)
18         number /= 5;
19     
20     return (number==1) ? 0 : -1;
21 }
22 
23 // 低效方法
24 int getUglyNumber1(int n)
25 {
26     if (n <= 0)
27         return -1;
28     
29     int number = 0;
30     while (n != 0)
31     {
32         ++ number;
33         if (isUgly(number) == 0)
34             n --; 
35     }
36     printf("%d\n", number);
37     return number;
38 }
39 
40 int MinOfThree(int a, int b, int c)
41 {
42     int minNum = a>b ? b : a;
43     minNum = minNum>c ? c : minNum;
44     return minNum;
45 }
46 
47 // 高效方法 空间换时间
48 int getUglyNumber2(int index)
49 {
50     if (index <= 1)
51         return index;
52     
53     int* ugly = (int*)malloc(sizeof(int) * index);
54     int i2 = 0;
55     int i3 = 0;
56     int i5 = 0;
57     ugly[0] = 1;
58     
59     for (int i = 1; i < index; ++i)
60     {
61         int temp2 = ugly[i2] * 2;
62         int temp3 = ugly[i3] * 3;
63         int temp5 = ugly[i5] * 5;
64         
65         int minNum = MinOfThree(temp2, temp3, temp5);
66         ugly[i] = minNum;
67         
68         if (minNum == temp2)
69             i2 ++;
70         if (minNum == temp3)
71             i3 ++;
72         if (minNum == temp5)
73             i5 ++;
74     }
75     printf("%d\n", ugly[index - 1]);
76     return ugly[index - 1];
77 }
78 
79 int main()
80 {
81     getUglyNumber1(1500);
82     getUglyNumber2(1500);
83 }

 

posted @ 2016-09-02 21:21  Juntaran  阅读(228)  评论(0编辑  收藏  举报