POJ1338 Ugly Numbers(解法二)

问题链接:POJ1338 Ugly Numbers。基础级练习题,用C语言编写程序。

题意简述:不能被2、3和5以外的素数整除的数称为丑数,找出第1500个丑数。

问题分析:换句话说,丑数的因子只能是2、3和5。1是丑数,对于x,若x是丑数则2x、3x和5x是丑数。利用已知的丑数,从小到不断生成丑数就可以了。

程序中,结果放在数组ans[]中,也是生产丑数的x;素数放在数组prime[]中,这个问题只有2、3和5;生成的丑数放在数组ugly[]中,然后选出最小的放入结果数组ans[]中,对于被放入数组的则计算下一个丑数(从小到大依次生成,逐个放入结果数组中)。

本问题打表是合适的。

AC的C语言程序如下:

/* POJ1338 Ugly Numbers */

#include <stdio.h>

#define MAXN 1500

typedef unsigned long long ULL;

ULL ans[MAXN+1] = {0, 1};

void maketable()
{
    int prime[] = {2, 3, 5};
    ULL ugly[sizeof(prime)/sizeof(prime[0])];
    int p[sizeof(prime)/sizeof(prime[0])];
    int count, size, i;

    size = sizeof(prime)/sizeof(prime[0]);

    count = 1;
    for(i=0; i<size; i++) {
        p[i] = 1;
        ugly[i] = ans[p[i]] * prime[i];
    }

    while(count < MAXN) {
        ULL min = ugly[0];
        int j = 0;

        /* 找出最小元素 */
        for(i=1; i<size; i++) {
            if(ugly[i] < min) {
                min = ugly[i];
                j = i;
            }
        }

        /* 生成的丑数没有重复,加入表中 */
        if(ans[count] != min)
            ans[++count] = min;

        /* 生成下一个最小丑数 */
        ugly[j] = ans[++p[j]] * prime[j];
    }
}

int main(void)
{
    int n;

    maketable();

    while(scanf("%d", &n) != EOF && n != 0)
        printf("%llu\n", ans[n]);

    return 0;
}
时间: 2024-10-23 07:35:42

POJ1338 Ugly Numbers(解法二)的相关文章

poj1338 Ugly Numbers(丑数模拟)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1338 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 number

POJ1338 Ugly Numbers

问题链接:POJ1338 Ugly Numbers.基础级练习题,用C++语言编写程序. 题意简述:不能被2.3和5以外的素数整除的数称为丑数,找出第1500个丑数. 问题分析:换句话说,丑数的因子只能是2.3和5.1是丑数,对于x,若x是丑数则2x.3x和5x是丑数.利用已知的丑数,从小到不断生成丑数就可以了. 程序中,使用一个STL的容器set来存放丑数.集合具有去重复,自动排序的功能,对于解决本问题是方便的.但是,set对象无法用下标访问,所以倒腾到vector对象中再使用.本问题打表是合

UVA 136 &amp; POJ1338 Ugly Numbers

题目大意: 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. 把只含有2.3.5因数的数称为丑数,默认第一个丑数是1. POJ是有多次询问,输出第n个丑数 UVA是询问第1500个丑数是多少. 思路:

Ugly Numbers(POJ1338)(丑数,技巧性强)

Ugly Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20851   Accepted: 9248 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 num

【优先队列基础练习】POJ1338 Uva136 - Ugly Numbers题解

昨天夜里学了栈.队列和优先队列,栈还有的地方不大懂,队列基本可以,优先队列很高兴.本想今天上午继续弄这个,但是跟着李晨他们一块听了清华交院罗雨屏老师讲的计算几何= =虽然以我的水平听计算几何有点早,但至少是听懂了很多,感觉很高兴:十点多就没有再听,毕竟之后越来越深亚历山大.于是就来写一下丑数的题解. 题目:除2,3,5外不能被其他素数整除的数为丑数,求第1500个丑数(Uva版),求第n(n<=1500)个丑数(POJ版) 思路:第一个是1,放入升序优先队列(小的先出),之后每次出队第一个元素,

poj 1338 Ugly Numbers

Ugly Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21315   Accepted: 9520 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 num

NYOJ1097 Ugly Numbers 【丑数】

Ugly Numbers 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 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, 15, ... shows the first 11 ugly numbers. By convention, 1 is included. Now give you need

Ugly Numbers(1.5.8)

Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64 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,

丑数(Ugly Numbers,UVA 136)

#include<iostream> #include<set> #include<vector> #include<queue> using namespace std; const int coeff[3]={2,3,5}; typedef long long LL; int main() { priority_queue<LL,vector<LL>,greater<LL> > pq; set<LL> s;