面试题49:丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。
解决方法
♞逐个判断每个整数是不是丑数的解法,直观但不够高效
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
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;
}
int getUglyNumber(int index){
if(index<=0) return 0;
int number=0;
int uglyFound=0;
while(uglyFound<index){
number++;
if(isUgly(number)) uglyFound++;
}
return number;
}
int main() {
printf("%d", getUglyNumber(1500));
return 0;
}
♞创建数组保存已经找到的丑数,用空间换时间的解法
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
int Min(int num1, int num2, int num3){
return min(min(num1, num2), num3);
}
int getUglyNumber_Solution2(int index){
if(index<=0) return 0;
int* pUglyNumbers=new int[index];
pUglyNumbers[0]=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;
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 main() {
printf("%d", getUglyNumber_Solution2(1500)); // 859963392
return 0;
}