Codefights challenge 丑数

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]

 

posted @ 2015-03-26 20:06  Naturain  阅读(223)  评论(0编辑  收藏  举报