Codefights challenge 丑数

本文介绍了两种求解第n个丑数的有效方法。第一种是经典的贪心算法实现,通过维护四个指针来更新丑数序列;第二种则是通过预先构建丑数序列并排序的方式实现。两种方法均适用于求解特定范围内的丑数。

2015-03-26 11:49:09

无意间看到的.. codefights上的一道challenge...

  题意:定义仅能被2,3,5,7整除的数定义为丑数,让你写一个函数快速求出第n个丑数。(n<=5842,第5842个丑数刚好不超过int范围)

  The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers.

  (1)经典写法是:开4个标记下标的变量a2,a3,a5,a7,初始化均为0。并且开一个数组来保存丑数,初始化:h[5843] = {1}

      然后逐渐加入丑数,当前加入的数为min(h[a2]*2 , h[a3]*3 , h[a5]*5 , h[a7]*7),假设当前加入h[a5],那么a5++。(其他类似)

      注意判重。易证这种贪心方法是正确的。

1 int humble(int n) {
2       int i,j,v[5843]={1},c,a[4]={0},k[]={2,3,5,7};
3     for(i=1;i<n;){
4         for(j=0,c=2e9;j<4;j++)c=std::min(c,v[a[j]]*k[j]);
5         if(v[i-1]!=c)v[i++]=c;
6         for(j=0;j<4;j++)if(c==v[a[j]]*k[j])a[j]++;
7     }
8     return v[n-1];
9 }

 

  (2)由于要求的丑数个数并不大,我们可以用一种类似累乘的方法,先构造2^1,2^2...2^k,且2^k为小于int的最大值,然后再加入3,并用3乘上

      所有已有的值... 最后将构造出来的数列排序即可... 看到别人用Python写的无比精简... orz...

1 def humble(n):
2   f = [1]
3   for p in 2, 3, 5, 7:
4     for x in f:
5       f += [x * p] * (x < 9e9)
6   
7   f.sort()
8   
9   return f[n - 1]

 

转载于:https://www.cnblogs.com/naturepengchen/articles/4369901.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值