POJ-1338-Ugly Numbers-丑数
我们要筛选质因子只有2,3,5的数
这种数字有个特点:
_______________数 = 2^a × 3^b × 5^c
所以我们创建一个数组准备存储这些数字,可知这些数字都可以背2或者3或者5整除, 所以我们就可以想到从最小的几个数字来乘2,3,5 来得到整个数组:
可以想象三个水桶我们要记录水的高度,每个水桶分别是乘 2, 3, 5的水桶,我们要每次记录最小的那个水的高度,然后将那个水桶的指针向上调一格,指向当前水桶的下一个水位;
_____________具体的实现看下面代码注解
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn = 10000;
int a[maxn];
int n;
void init()
{
a[1] = 1;
int p1 = 1,p2 = 1,p3 = 1;
//三个水桶的水慢慢加大来实现新的数出现加入数组
for(int i = 2; i <= 1550; i ++)//记录1500个数字
{
int b[3] = {2*a[p1],3*a[p2],5*a[p3]};//将三个值分别列出
sort(b,b+3); //排序
a[i] = b[0];//将最小值放入数组中
if(a[i] == 2*a[p1]) p1 ++;// 如果与放入数组的相同,那么我们将指针移动一位
if(a[i] == 3*a[p2]) p2 ++;
if(a[i] == 5*a[p3]) p3 ++;
}//这里没有加else可以排除重复
//每次加入的新数字都是从原来数组里面乘2,3,5得到的最小的
}
int main()
{
init();
while(scanf("%d",&n) && n)
{
printf("%d\n",a[n]);
}
return 0;
}