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;

} 

 

posted on 2013-03-02 09:41  crying_Dream  阅读(169)  评论(0编辑  收藏  举报