POJ 1338 Ugly Numbers

http://poj.org/problem?id=1338b

最小的丑数是1,以后的丑数为在以前的基础上进行*2, *3, *5....

那么设第i个丑数为F[i]=min{F[n2]*2, F[n3]*3, F[n5]*5},其中n2, n3, n5....表示进行衍生丑数的下标。暴力的打出1500个丑数要很久很久....才出来结果....

代码如下:

View Code
/*  POJ 1338丑数

*/

#include<stdio.h>

#include<iostream>

using namespace std;

long long f[1505];

long long minx(long long x1, long long x2, long long x3)

{

     long long xx=999999999;

     if(x1<xx)  xx=x1;

     if(x2<xx)  xx=x2;

     if(x3<xx)  xx=x3;

     return xx;

}

int main()

{

    int i, n2=1, n3=1, n5=1, n;

    f[1]=1;

    for(i=2; i<=1500; i++)

    {

        f[i]=minx(f[n2]*2, f[n3]*3, f[n5]*5);

        if(f[i]==f[n2]*2)  n2++;

        if(f[i]==f[n3]*3)  n3++;

        if(f[i]==f[n5]*5)  n5++;

    }

    while(cin>>n)

    {

        if(n==0)  break;

        cout<<f[n]<<endl;

    }

    return 0;

} 

 

转载于:https://www.cnblogs.com/Hilda/archive/2013/03/02/2939691.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值