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;
}