題目:我們把只包含因子 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;
}