只包含因子2/3/5的数称为丑数。
方法1:逐个判断每个整数是不是丑数
方法2:创建数组保存已经找到的丑数,用空间换时间的方法
每一个丑数都是前面的丑数乘以2、3、5得到的
已有丑数中最大丑数为M,下一个丑数应该是已知丑数分别乘以2、3、5的第一个大于M的数,记录,每个乘以2、3、5第一个大于M的位置更新。
#include<iostream>
using namespace std;
bool IsUgly(int num)
{
while(num%2==0)
num = num/2;
while(num%3==0)
num = num/3;
while(num%5==0)
num = num/5;
return (num==1)?true:false;
}
int GetUglyNumber1(int N)
{
if(N<=0)
return 0;
int uglyNum=0;
int num=0;
while(uglyNum<N)
{
num++;
if(IsUgly(num))
uglyNum++;
}
return num;
}
int Min(int num1,int num2 ,int num3)
{
int min = num1<num2? num1:num2;
min = min<num3?min:num3;
return min;
}
int GetUglyNumber2(int N)
{
if(N<=0)
return 0;
int *uglyNumbers = new int[N+1];
uglyNumbers[0]=1;
int index = 0;
int *uglyNum2=uglyNumbers;
int *uglyNum3=uglyNumbers;
int *uglyNum5=uglyNumbers;
while(index<N)
{
int min = Min(*uglyNum2*2,*uglyNum3*3,*uglyNum5*5);
uglyNumbers[++index] = min;
while(*uglyNum2*2<=uglyNumbers[index])
uglyNum2++;
while(*uglyNum3*3<=uglyNumbers[index])
uglyNum3++;
while(*uglyNum5*5<=uglyNumbers[index])
uglyNum5++;
}
int result = uglyNumbers[index-1];
delete []uglyNumbers;
return result;
}
void Test(char* testName,int N,int expected)
{
cout<<testName<<endl;
cout<<"Solution1:\t";
if(expected == GetUglyNumber1(N))
cout<<"Passed"<<endl;
else
cout<<"Failed"<<endl;
cout<<"Solution2:\t";
if(expected == GetUglyNumber2(N))
cout<<"Passed"<<endl;
else
cout<<"Failed"<<endl;
cout<<endl;
}
void Test1()
{
int N = 4;
Test("test1",N,4);
}
void Test2()
{
int N = 7;
Test("test2",N,8);
}
void Test3()
{
int N = 1;
Test("test3",N,1);
}
void Test4()
{
int N = 0;
Test("test4",N,0);
}
int main()
{
Test1();
Test2();
Test3();
Test4();
}