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