题目:我们把只包含因子 2、3、5的数称为是丑数,求按从小到大的顺序的第n个丑数。
看不懂的可以私聊我,虽然是书上的代码和思路,但还是以自己弄懂为主
int Min(int number1, int number2, int number3)
{
int min = (number1 < number2) ? number1:number2;
min = (min < number3) ? min : number3;
return min;
}
int GetUglyNumber_Solution2(int index)
{
if(index <= 0) return 0;
int *pUglyNumbers = new int[index]; //定义了一个index这么大的丑数数组
pUglyNumbers[0] = 1; //将丑数数组的第一个数设置为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;
//下面这三行代码其实就是为了寻找最新的大于M的那个最小丑数的(Min(*pMultiply2 * 2,*pMultiply3 * 3, *pMultiply5 * 5))这三个P2,P3,P5在数组中的左标的
while(*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex]) pMultiply2 = pMultiply2 + 1;
while(*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex]) pMultiply3 = pMultiply3 + 1;
while(*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex]) pMultiply5 = pMultiply5 + 1;
++nextUglyIndex; //当P2,P3,P5所在位置的数乘以各自的时候都即将不小于数组中最大丑数时丑数数组该更新最大丑数了,也就是选这三个中乘以各自之后最小的值
}
int ugly = pUglyNumbers[nextUglyIndex -1];
delete[] pUglyNumbers;
return ugly;
}
int main()
{
cout<<GetUglyNumber_Solution2(1500)<<endl;
return 0;
}