丑数

 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.
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

 

 

 

#include <stdio.h>

int min(int a,int b);

int main()

{

    int n,a[1505],i;

    while(scanf("%d",&n)!=EOF)

    {

        if(n==0)

            break;

        int x=0,y=0,z=0;

        a[0]=1;a[1]=1;

        for(i=1;i<1505;i++)

        {

            for(;x<i;x++)

            {

                if(2*a[x]>a[i-1])

                    break;

            }

            for(;y<i;y++)

            {

                if(3*a[y]>a[i-1])

                    break;

            }

            for(;z<i;z++)

            {

                if(5*a[z]>a[i-1])

                    break;

            }

            a[i]=min(a[x]*2,a[y]*3);

            a[i]=min(a[i],a[z]*5);

        }

        printf("%d\n",a[n-1]);

    }

    return 0;

}

int min(int a,int b)

{

    if(a>b)return b;

    else return a;

}

 

以下为大神讲解:

赶紧来试一试。不过假设给了我们从1开始的10个丑数,怎么找出第11个呐?等等,诶,丑数不是只由235构成的嘛,而且我们拿到的数也是由235构成的,而且是最小的10个,那么第11个一定就比前十个数中的某一个多一个因子2,或者因子3,或者因子5……也就是说,第11个丑数一定是前十个丑数中某一个丑数的2倍,或者3倍,或者5倍!!

 

        这个很关键,再仔细想一想噢。现在知道了 11个丑数一定是前十个丑数中某一个丑数的2倍,或者3倍,或者5倍,还是不行呢,那到底是2倍还是3倍还是5倍呢o(︶︿︶)o。。。

 

        想起来啦,我们的第十一个丑数一定是,大于第十个丑数的所有丑数中,最小的!!!那就是说,我们可以在第一到第十个丑数中找出某个丑数 a ,它的两倍刚好大于第十个丑数(刚好的意思就是,上一个数的两倍还小于第十个丑数,而它自己的两倍却大于第十个丑数了);然后再找出前十个丑数中的三倍刚好大于第十个丑数的家伙 b ;最后找出前十丑数中某丑数5倍刚好大于第十个丑数的丑数 c ~~~2*a3*b5*c,找出这三个中最小的就行啦(*^__^*)

上面的代码就是根据这个来的 网上还有使用map的。。。貌似也是可以的。。。

 

注意:用c++提交。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值