1. 程式人生 > >《劍指offer》第四十九題(醜數)

《劍指offer》第四十九題(醜數)

醜數 exp 第一個 算法 ber 大於 offer return false

// 面試題49:醜數
// 題目:我們把只包含因子2、3和5的數稱作醜數(Ugly Number)。求按從小到
// 大的順序的第1500個醜數。例如6、8都是醜數,但14不是,因為它包含因子7。
// 習慣上我們把1當做第一個醜數。

#include <iostream>

// ====================算法1的代碼====================
//不用額外的內存,直接計算
bool IsUgly(int number)//判斷是不是醜數
{
    while (number % 2 == 0)
        number /= 2;
    while
(number % 3 == 0) number /= 3; while (number % 5 == 0) number /= 5; return (number == 1) ? true : false; } int GetUglyNumber_Solution1(int index) { if (index <= 0) return 0; int number = 0; int uglyFound = 0; while (uglyFound < index)//從頭到尾開始計算
{ ++number; if (IsUgly(number)) ++uglyFound; } return number; } // ====================算法2的代碼==================== //使用內存,只計算醜數,節省時間 int Min(int number1, int number2, int number3); int GetUglyNumber_Solution2(int index) { if (index <= 0)
return 0; int *pUglyNumbers = new int[index]; pUglyNumbers[0] = 1; int nextUglyIndex = 1; int *pMultiply2 = pUglyNumbers;//用來存儲前面醜數的二倍值中,剛好大於當前最大醜數的數值 int *pMultiply3 = pUglyNumbers;//三倍 int *pMultiply5 = pUglyNumbers;//五倍 while (nextUglyIndex < index) { int min = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5);//將這三個值中最小值作為下一個醜數存儲 pUglyNumbers[nextUglyIndex] = min; while (*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex])//更新這三個值 ++pMultiply2; while (*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex]) ++pMultiply3; while (*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex]) ++pMultiply5; ++nextUglyIndex; } int ugly = pUglyNumbers[nextUglyIndex - 1]; delete[] pUglyNumbers; return ugly; } int Min(int number1, int number2, int number3) { int min = (number1 < number2) ? number1 : number2; min = (min < number3) ? min : number3; return min; } // ====================測試代碼==================== void Test(int index, int expected) { if (GetUglyNumber_Solution1(index) == expected) printf("solution1 passed\n"); else printf("solution1 failed\n"); if (GetUglyNumber_Solution2(index) == expected) printf("solution2 passed\n"); else printf("solution2 failed\n"); } int main(int argc, char* argv[]) { Test(1, 1); Test(2, 2); Test(3, 3); Test(4, 4); Test(5, 5); Test(6, 6); Test(7, 8); Test(8, 9); Test(9, 10); Test(10, 12); Test(11, 15); Test(1500, 859963392); Test(0, 0); system("pause"); return 0; }

《劍指offer》第四十九題(醜數)