poj 1338,2247,2545,2591
这几个都是类似的题目,就是将满足要求的数列出来,给出一个n,问你第n个数是多少?
以1338为例:
对于每一个质数2 3 5,我们都要找到对应的之前已经计算出的最小的丑数使之乘以这个质数后大于当前的丑数,然后再从这三个里取最小的那个,我们记录三个数a2,a3,a5,分别保存对应的质数计算到哪个下标了,然后更新所有质数对应的下标,使之乘积大于当前的丑数。
#include <iostream> using namespace std; const int M=1501; int ans[M]; int getMin(int a,int b,int c) { int rs=0; if(a>b) rs=b; else rs=a; if(rs>c) rs=c; return rs; } int main() { int a2,a3,a5,i,tmp,n; a2=1; a3=1; a5=1; ans[1]=1; for(i=2;i<M;i++) { tmp=getMin(ans[a2]*2,ans[a3]*3,ans[a5]*5); ans[i]=tmp; if(tmp==ans[a2]*2) ++a2; if(tmp==ans[a3]*3) ++a3; if(tmp==ans[a5]*5) ++a5; // cout<<a2<<" "<<a3<<" "<<a5<<endl; } while(cin>>n) { if(0 == n) break; cout<<ans[n]<<endl; } return 0; }