POJ-1338-Ugly Numbers-丑数

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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值