1. 程式人生 > >微軟100題(64)尋找第1500個醜數

微軟100題(64)尋找第1500個醜數

題目:我們把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,
但14不是,因為它包含因子7。習慣上我們把1當做是第一個醜數。

求按從小到大的順序的第1500個醜數。

思路:

最直觀的方法,逐一判斷是不是醜數,知道找到1500個醜數

bool isUgly(int number)
{
	while (number%2==0)
		number = number/2;
	while (number%3==0)
		number = number/3;
	while (number%5==0)
		number = number/5;
	return (number==1)?true:false;
}

但是貌似很慢,實際上從1開始 每次乘以2 3 5,最小的是2,下次比較4 3 5 ,最小是3 下次比較4 6 5 以此類推

每次找最小的

int GetUglyNum(int index)
{
	if(index<=0) return 0;
	int *uglynumber = new int[index];
	uglynumber[0] = 1;
	int nextuglyindex = 1;
	int *pMulitBy2 = uglynumber;
	int *pMulitBy3 = uglynumber;
	int *pMulitBy5 = uglynumber;
	while (nextuglyindex<index)
	{
		int minnum = min(*pMulitBy2*2,min(*pMulitBy3*3,*pMulitBy5*5));
		uglynumber[nextuglyindex] = minnum;
		while(*pMulitBy2*2 <= uglynumber[nextuglyindex] )
			pMulitBy2++;
		while(*pMulitBy3*3 <= uglynumber[nextuglyindex] )
			pMulitBy3++;
		while(*pMulitBy5*5 <= uglynumber[nextuglyindex] )
			pMulitBy5++;
		nextuglyindex++;
	}
	int answer = uglynumber[nextuglyindex-1];
	delete[] uglynumber;
	uglynumber = NULL;
	return answer;
}