题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。
两种方法:暴力求解和空间换时间
//直接暴力求解
int getUglyNumber(int index)
{
if (index <= 0)
return 0;
int number = 0;
int uglyNumber = 0;
while (uglyNumber < index)
{
++number;
if (isUglyNumber(number))
++uglyNumber;
}
return number;
}
bool isUglyNumber(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(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 = minNumber(*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 uglyNumber = pUglyNumbers[nextUglyIndex-1];
delete[] pUglyNumbers;
return uglyNumber;
}
int minNumber(int a, int b, int c)
{
int min = (a < b) ? a : b;
min = (min < c) ? min : c;
return min;
}