基础版本:
bool IsUglyNum(int64_t data)
{
int64_t curData = data;
while (curData % 2 == 0) curData /= 2;
while (curData % 3 == 0) curData /= 3;
while (curData % 5 == 0) curData /= 5;
return 1 == curData ? true : false;
}
int64_t GetUglyNum(int destIdx)
{
if (destIdx < 0) return -1;
int64_t destData = 1;
for (int curIdx = 0, curData = 1; curIdx != destIdx; ++curData)
{
if (IsUglyNum(curData))
{
++curIdx;
destData = curData;
}
}
return destData;
}
高效版本:
int64_t MinOfThree(int64_t left, int64_t middle, int last)
{
int finalData = left < middle ? left : middle;
finalData = finalData < last ? finalData : last;
return finalData;
}
int64_t GetUglyNum(int destIdx)
{
if (destIdx < 0) return -1;
int64_t* pTempData = new int64_t[destIdx];
pTempData[0] = 1;
int64_t* firstBiggerPMultiBy2 = pTempData;
int64_t* firstBiggerMultiBy3 = pTempData;
int64_t* firstBiggerMultiBy5 = pTempData;
for (int curIdx = 1; curIdx != destIdx; ++curIdx)
{
int64_t curMaxNum = pTempData[curIdx - 1];
while (*firstBiggerPMultiBy2 * 2 <= curMaxNum) ++firstBiggerPMultiBy2;
while (*firstBiggerMultiBy3 * 3 <= curMaxNum) ++firstBiggerMultiBy3;
while (*firstBiggerMultiBy5 * 5 <= curMaxNum) ++firstBiggerMultiBy5;
int64_t destNum = MinOfThree(*firstBiggerPMultiBy2 * 2, *firstBiggerMultiBy3 * 3, *firstBiggerMultiBy5 * 5);
pTempData[curIdx] = destNum;
}
int destNum = pTempData[destIdx - 1];
delete[] pTempData;
return destNum;
}