《剑指offer》第四十九题(丑数)
生活随笔
收集整理的這篇文章主要介紹了
《剑指offer》第四十九题(丑数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// 面試題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");elseprintf("solution1 failed\n");if (GetUglyNumber_Solution2(index) == expected)printf("solution2 passed\n");elseprintf("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;
}
?
轉載于:https://www.cnblogs.com/CJT-blog/p/10526308.html
總結
以上是生活随笔為你收集整理的《剑指offer》第四十九题(丑数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序加载本地图片路径问题
- 下一篇: Golang 入门系列(十) mysql