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]