我们把只包含因子2、3和5的数称为丑数(Ugly Number)。求按从大到小的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第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;
}
那么这个算法,从1开始算第1500个丑数也没难度了。
但是,重复计算和一眼看出来就不可能是丑数的也计算在内了。那么更好的方法呢?
看下面代码:
int GetUglyNumber_Solution2(int index)
{
if(index<=0)
return 0;
int *pUglyNumbers=new int[index] ;
pUglyNumbers[0]=1;
int nextUglyIndex=1;
int *pMultiply22=pUglyNumbers;
int *pMultiply3=pUglyNumbers;
int *pMultiply5=pUglyNumbers;
while(nextUglyIndex<index)
{
int min=Min(*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 ugly=pUglyNumbers[nextUglyIndex-1];
delete[] pUglyNumbers;
return ugly;
}
int Min(int number1,int number2,int number3)
{
int min=(number1<number2)?number1:number2;
min=(min<number3)?min:number3;
return min;
}