• poj---1338---Ugly Numbers


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

    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 22968   Accepted: 10218

    Description

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence  1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...  shows the first 10 ugly numbers. By convention, 1 is included.  Given the integer n,write a program to find and print the n'th ugly number. 

    Input

    Each line of the input contains a postisive integer n (n <= 1500).Input is terminated by a line with n=0.

    Output

    For each line, output the n’th ugly number .:Don’t deal with the line with n=0.

    Sample Input

    1
    2
    9
    0
    

    Sample Output

    1
    2
    10
    

    Source

     
    丑数的定义:一个数的素因数只有2, 3,或5.
    因此只有这三个数来回的做乘法,按顺序存起来就OL!
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    #include<queue>
    #include<stack>
    #include<algorithm>
    using namespace std;
    
    const int maxn=1502;
    const int INF=0x3f3f3f3f;
    
    int ugly[maxn]= {0, 1};
    
    
    void Init()
    {
        int num2=2, num3=3, num5=5;
        int i, j, k, t;
        i=j=k=1;
    
        for(int x=2; x<maxn; x++)
        {
            t=min(num2, min(num3, num5));
            ugly[x]=t;
    
            if(t==num2)
                num2=ugly[++i]*2;
    
            if(t==num3)
                num3=ugly[++j]*3;
    
            if(t==num5)
                num5=ugly[++k]*5;
        }
    }
    int main()
    {
        Init();
        int n;
    
        while(scanf("%d", &n), n)
            printf("%d
    ", ugly[n]);
        return 0;
    }
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<math.h>
    #include<queue>
    #include<set>
    #include<map>
    #include<algorithm>
    typedef long long LL;
    using namespace std;
    const int maxn=10010;
    const int INF=0x3f3f3f3f;
    const int ugly[3]={2, 3, 5};
    LL a[maxn];
    void init()
    {
        priority_queue<LL, vector<LL>, greater<LL> >Q;
        set<LL> s;
        Q.push(1);
        s.insert(1);
        int k=1;
        for(int i=1; ; i++)
        {
            LL x=Q.top();
            Q.pop();
            a[k++]=x;
            if(i==1520)
                break;
            for(int j=0; j<3; j++)
            {
                LL t=x*ugly[j];
                if(!s.count(t))
                {
                    s.insert(t);
                    Q.push(t);
                }
            }
        }
    }
    int main()
    {
        init();
        int n;
        while(scanf("%d", &n), n)
        {
            printf("%lld
    ", a[n]);
        }
        return 0;
    }
  • 相关阅读:
    Spark实战练习03--Pair RDD
    Spark实战练习02--处理分隔符
    Spark实战练习01--XML数据处理
    做一个”合格“的程序员(二)——学习管理
    做一个“合格”的程序员(一)——基础能力
    图像处理算法之帧间差分法
    图像几何变换之透视变换
    图像几何变换之仿射变换
    内部排序之简单选择排序
    非极大值抑制算法
  • 原文地址:https://www.cnblogs.com/w-y-1/p/5752065.html
Copyright © 2020-2023  润新知