zoukankan      html  css  js  c++  java
  • 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
    ", ans[n]);
    
        return 0;
    }


  • 相关阅读:
    browserwindow.js
    Spring官网下载dist.zip的几种方法
    Vmware vsphere client
    chkconfig
    【WS-Federation】到底有多少公司在用WS-Federation
    【Passport】微软过时的技术
    【NHibernate】应用层面需要掌握的知识汇总
    【NHibernate】HQL入门
    【内存】特别想看下程序在内存中的状态
    【NHibernate】配置- sql打印
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564450.html
Copyright © 2011-2022 走看看