丑数

    一般把只包含因子2,3,5的数称为丑数,一般1为第一个丑数

题目:

求第N个丑数

程序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(int index)
{
	if (index <= 0)
		return 0;
	int number = 0;
	int find = 0;
	while (find < index)
	{
		++number;
		if (IsUgly(number))
			++find;
	}
	return number;
}

程序2:以空间换时间的算法

思想:创建一个数组,里面的数字是排序好的丑数,每一个丑数都输前面的丑数乘以2、3、5得到的

int Min(int num1, int num2, int num3)
{
	int min = (num1 < num2) ? num1 : num2;
	return (min < num3) ? min : num3;
}
int GetUglyNumber(int index)
{
	if (index <= 0)
		return 0;

	int *uglyNumbers = new int[index];
	uglyNumbers[0] = 1;
	int nextUglyIndex = 1;

	int *pNext1 = uglyNumbers;
	int *pNext2 = uglyNumbers;
	int *pNext3 = uglyNumbers;

	while (nextUglyIndex < index)
	{
		int min = Min(*pNext1 * 2, *pNext2 * 3, *pNext3 * 5);
		uglyNumbers[nextUglyIndex] = min;

		while (*pNext1 * 2 <= uglyNumbers[nextUglyIndex])
			++pNext1;
		while (*pNext2 * 3 <= uglyNumbers[nextUglyIndex])
			++pNext2;
		while (*pNext3 * 5 <= uglyNumbers[nextUglyIndex])
			++pNext3;
		++nextUglyIndex;
	}
	int ugly = uglyNumbers[nextUglyIndex - 1];
	delete[]uglyNumbers;
	return ugly;
}