10
分析:
这个题的关键是模拟出来规律,然后用筛法离线求出1500个丑数。
一开始用了一种比较慢的算法模拟了一下
代码如下
//第一时间想到的低效算法
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int ans[1505];
const int tt[3]={2,3,5};
bool ugly(int x)
{
while(x!=1)
{
if(0==x%2)
x/=2;
else if(0==x%3)
x/=3;
else if(0==x%5)
x/=5;
else
return false;
}
return true;
}
int main()
{
int n,i,k;
k=0;
ans[k]=1;
for(i=2;k<1500;i++)
{
if(ugly(i))
ans[++k]=i;
}
while(cin>>n, n>0)
{
cout<<ans[n-1]<<endl;
}
return 0;
}
之后用筛法模拟出1500个丑数AC的
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int ans[1505];
int main()
{
int n,i,j,k,t;
memset(ans,0,sizeof(ans));
ans[1]=1;
i=1,j=1,k=1;
for(t=2; t<=1500; t++)
{
ans[t]=min(min(ans[i]*2,ans[j]*3),ans[k]*5);
if(ans[i]*2==ans[t])
++i;
if(ans[j]*3==ans[t])
++j;
if(ans[k]*5==ans[t])
++k;
}
while(cin>>n, n>0)
cout<<ans[n]<<endl;
return 0;
}原文地址:http://blog.csdn.net/u011694809/article/details/46544825