微軟100題(64)尋找第1500個醜數
阿新 • • 發佈:2019-01-05
題目:我們把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,
但14不是,因為它包含因子7。習慣上我們把1當做是第一個醜數。
但是貌似很慢,實際上從1開始 每次乘以2 3 5,最小的是2,下次比較4 3 5 ,最小是3 下次比較4 6 5 以此類推
但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; }