poj1338 Ugly Numbers

题目:
求第几个只拥有素数因素为2,3,5的数,包括1在内
分析:
因为只要求求到第1500个,可以用打表的方法来做,把前1500个数全部求出来,
因为每一个ugly数都可以用某个以前的数来进行因素分解,所以不停地搜索当
2,3,5乘以某个数恰好大于当前最大的ugly,这个数即为最新的ugly数,具体
请看代码:

#include <iostream>
using namespace std;
#define X 1505
int ugly[X];//记录前1500个ugly数
int tot;
void solve()//搜索函数
{
        int tot = 0;
        int p2 =1, p3 = 1,p5 =1;//分别表示2 3 5的当前乘以某个ugly恰好大于最大的ugly数的位置
        ugly[++tot] = 1;
        while(tot<=1500)
       {
                while(2*ugly[p2]<=ugly[tot])//直到搜索到恰好大于最大的ugly数位置
                p2++;
                while(3*ugly[p3]<=ugly[tot])//同理
                p3++;
                while(5*ugly[p5]<=ugly[tot])//同理
                p5++;
                //把上面三个求到的数的最小值赋给最新的ugly数
                ugly[++tot] = min(2*ugly[p2],min(3*ugly[p3],5*ugly[p5]));
        }
}
int main()
{
         freopen("sum.in","r",stdin);
         freopen("sum.out","w",stdout);
         int n;
         solve();
         while(cin>>n,n)
         cout<<ugly[n]<<endl;
         return 0;
}

原文地址:https://www.cnblogs.com/yejinru/p/2374681.html