poj1338

原来这种方法叫打表。

假设a[n]表示第n个这样的数,则a[1]=1,显然,更大的丑数只能由小的丑数通过乘以2,3,5得到.维护三个头指针,一个尾指针.头指针h1,h2,h3分别指向a[h1],a[h2],a[h3]分别乘以2,3,5能够比目前得到的最大丑数稍大的最小丑数,尾指针则指向目前最大的丑数.显然,如果乘积小于最大的丑数,那就将头指针后移.否则选择三个值中最小的那个加入队尾,直到尾指针到达目标.

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define MAX_POS 1500

int myMin(int a,int b,int c)
{
  int min;
  min=a<b?a:b;
  min=min<c?min:c;
  return min;
}
int main()
{
  int ugly[MAX_POS+1],i;
  int value2,value3,value5;
  int p2,p3,p5;
  int n;
  p2=p3=p5=1;
  ugly[1]=1;
  for(i=2;i<=MAX_POS;i++)
  {
    value2=ugly[p2]*2;
    value3=ugly[p3]*3;
    value5=ugly[p5]*5;
    ugly[i]=myMin(value2,value3,value5);
    if(ugly[i]==value2)  p2++;
    if(ugly[i]==value3)  p3++;
    if(ugly[i]==value5)  p5++;
  }
  while(scanf("%d",&n)&&n)
  {
    printf("%d\n",ugly[n]);
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值