我们把只包含因子2,3,5的书称为丑数,把1当做第一个丑数,求从小到大的第n个丑数。
输入:1到500之间的整数(包含1和500)
输出:第n个丑数。不在1-500输出-1
方法一:
#include<iostream>
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 count=0;
while(count<index)
{
++number;
if(IsUgly(number))
count++;
}
return number;
}
int main()
{
int n;
cin>>n;
int number=GetUglyNumber(n);
if(number<500)
cout<<number<<endl;
else
cout<<-1<<endl;
}
方法二:
#include<iostream>
using namespace std;
int Min(int a,int b,int c)
{
int min= a < b ? a:b;
min=(min<c)? min:c;
return min;
}
int GetUglyNumber(int index)
{
if(index <1 ||index >500)
return -1;
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[index-1];
delete [] pUglyNumbers;
return ugly;
}
int main()
{
int n;
cin>>n;
int number=GetUglyNumber(n);
if(number<500)
cout<<number<<endl;
else
cout<<-1<<endl;
}