pku 1338 Ugly Numbers

转一个分析:

 这道题主要是要我们找出只含2,3,5这三个因子的数,按顺序排列出来,然后根据题目输入一个下标,程序要给出这个位置的数,如前10个这样的数是:1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 10 , 12 .....

    这题目我们都知道是找2^x*3^y*5^z中的x,y,z使得序列呈递增,那我们怎样确定x,y,z呢?这里要用到p2,p3,p5来指向这个序列,表示它们所指向的序列可以乘以2,3,5(是对应乘,即p2指向的可以乘以2,p3指向的可以乘以3,p5指向的可以乘以5),只要乘一次那么指针就向后移动一个位置,意味着下一个可以乘以2,3,5的数是哪些。这样就可以用p2,p3,p5指向的数乘以对应的值后,选择一个最小的做为序列的下一个数,以此类推下去,找出1500个这样的数,再按题目的输入打印所需要的结果。


#include <stdio.h>

 

#define MAXN 1501

int ugly[MAXN];

inline int Min(int a,int b){return a<b?a:b;}
void init()
{
    int i,p2=1,p3=1,p5=1;
    ugly[1]=1;
    for(i=2;i<MAXN;i++)
    {
        ugly[i] = Min( ugly[p2]*2, Min(ugly[p3]*3, ugly[p5]*5));
        if(ugly[i] == ugly[p2]*2) p2++;
        if(ugly[i] == ugly[p3]*3) p3++;
        if(ugly[i] == ugly[p5]*5) p5++;
     //   printf("ugly[%d]=%d\n",i,ugly[i]);
    }
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
    #endif
    init();
    int n;
    while(scanf("%d",&n),n) printf("%d\n",ugly[n]);
    return 0;
}

posted @ 2010-09-11 12:18  菜到不得鸟  阅读(117)  评论(0)    收藏  举报