POJ 1388 Ugly Numbers

本文介绍了一种求解由2、3、5的乘积组成的数(被称为丑数)的算法,并通过设置三个指针来迭代计算这些数,最终实现了按顺序生成丑数的功能。

题意:题目意思是求由2,3,5的乘积组成的数从大到小排列,从1开始,2,3,4,5,6,8,9,。。。


分析:基本思想是设3个指针,分别表示3个素数乘到哪了,然后通过比较3个指针位置的递推结果来确定下一个数是什么。


//172K	0MS
#include <stdio.h>
#define MIN(a,b) ((a)<(b)?(a):(b)) 
#define N 1502
int num[N] ;

void Find_Ugly_Numbers ( )
{
    int p2 , p3 , p5 ;
    num[1] = 1 ;
    p2 = p3 = p5 = 1 ;
    int i ;
    for ( i = 2 ; i <= 1500 ; i ++ )
    {
        int t2 , t3 , t5 ;
        t2 = num[p2] * 2 ;
        t3 = num[p3] * 3 ;
        t5 = num[p5] * 5 ;
        num[i] = MIN(MIN(t2,t3),t5) ;
        if ( num[i]  == t2 )
        {
            p2 ++ ;
        }
        if ( num[i] == t3 ) 
        {
            p3 ++ ;
        }
        if ( num[i] == t5 ) 
        {
            p5 ++ ;
        }
    }
}

int
main ( )
{
    Find_Ugly_Numbers ( ) ;
    int n ;
    while ( EOF != scanf ("%d" , & n ) )
    {
        if ( 0 == n )
        {
            break ;
        }
        printf ("%d\n" , num[n] ) ;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值