思路1:遍歷
思路2: 根據丑數的定義,丑數應該是另一個丑數乘以2、3或者5的結果(1除外)。因此我們可以創建一個數組,裡面的數字是排好序的丑數。裡面的每一個丑數是前面的丑數乘以2、3或者5得到的。那關鍵就是確保數組裡的丑數是有序的了。我們假設數組中已經有若干個丑數,排好序後存在數組中。我們把現有的最大丑數記做M。現在我們來生成下一個丑數,該丑數肯定是前面某一個丑數乘以2、3或者5的結果。我們首先考慮把已有的每個丑數乘以2。在乘以2的時候,能得到若干個結果小於或等於M的。由於我們是按照順序生成的,小於或者等於M肯定已經在數組中了,我們不需再次考慮;我們還會得到若干個大於M的結果,但我們只需要第一個大於M的結果,因為我們希望丑數是按從小到大順序生成的,其他更大的結果我們以後再說。我們把得到的第一個乘以2後大於M的結果,記為M2。同樣我們把已有的每一個丑數乘以3和5,能得到第一個大於M的結果M3和M5。那麼下一個丑數應該是M2、M3和M5三個數的最小者。
1 #include <stdio.h> 2 #include "stdafx.h" 3 4 int IsUgly(int number) 5 { 6 while(number % 2 == 0) 7 number /= 2; 8 while(number % 3 ==0) 9 number /= 3; 10 while(number % 5 ==0) 11 number /= 5; 12 13 14 return (number == 1) ? true : false; 15 } 16 17 int GetUglyNumber_Solution1(int index) 18 { 19 if(index <= 0) 20 return 0; 21 22 int number = 0; 23 int uglyFound = 0; 24 while(uglyFound < index) 25 { 26 ++ number; 27 28 if(IsUgly(number)) 29 { 30 ++ uglyFound; 31 } 32 } 33 34 return number; 35 } 36 37 38 int Min(int number1, int number2, int number3); 39 40 int GetUglyNumber_Solution2(int index) 41 { 42 if(index <= 0) 43 return 0; 44 45 int *pUglyNumbers = new int[index]; 46 pUglyNumbers[0] = 1; 47 int nextUglyIndex = 1; 48 49 int *pMultiply2 = pUglyNumbers; 50 int *pMultiply3 = pUglyNumbers; 51 int *pMultiply5 = pUglyNumbers; 52 53 while(nextUglyIndex < index) 54 { 55 int min = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5); 56 pUglyNumbers[nextUglyIndex] = min; 57 58 while(*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex]) 59 ++pMultiply2; 60 while(*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex]) 61 ++pMultiply3; 62 while(*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex]) 63 ++pMultiply5; 64 65 ++nextUglyIndex; 66 } 67 68 int ugly = pUglyNumbers[nextUglyIndex - 1]; 69 delete[] pUglyNumbers; 70 return ugly; 71 } 72 73 int Min(int number1, int number2, int number3) 74 { 75 int min = (number1 < number2) ? number1 : number2; 76 min = (min < number3)? min : number3; 77 78 return min; 79 } 80 81 int main() 82 { 83 int index = 10; 84 printf("solution1 %d\n", GetUglyNumber_Solution1(index)); 85 printf("solution2 %d\n", GetUglyNumber_Solution2(index)); 86 printf("\n"); 87 88 index = 30; 89 printf("solution1 %d\n", GetUglyNumber_Solution1(index)); 90 printf("solution2 %d\n", GetUglyNumber_Solution2(index)); 91 printf("\n"); 92 93 index = 1500; 94 printf("solution1 %d\n", GetUglyNumber_Solution1(index)); 95 printf("solution2 %d\n", GetUglyNumber_Solution2(index)); 96 printf("\n"); 97 98 return 0; 99 }