[LintCode]4.丑数 II

来源:互联网 发布:highcharts.js api 编辑:程序博客网 时间:2024/06/05 09:39

设计一个算法,找出只含素因子235 的第 n 大的数。

符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12..

注意事项

我们可以认为1也是一个丑数

样例

如果n = 9, 返回 10

只包含因子2,3,5 的数称为丑数 。
思路:从第二个数开始,每一个数为第p2个数的二倍、第p3个数的三倍、第p5个数的五倍中最小的一个(初始p2/p3/p5都为第一个

直接寻找丑数,由丑数的定义可知,任何一个丑数都是2^i * 3^j * 5^m这种形式的,因此不断寻找丑数,将他们按从小到大的顺序进行排列,

直到第n个即为结果。首先定义一个数组存放丑数,认为1是丑数,则初始化数组num[0] = 1,然后从2,3,5这三个种子中挑选,选择num[0]*2,

num[0]*3,num[0]*5中最小的数为新的丑数,显然应该选择2,即num[1] = 2,然后在从2,3,5中选择,这时应该是从num[1]*2,num[0]*3,

num[0]*5中进行选择,显然选择3,即num[2] = 3,然后再从num[1]*2,num[1]*3,num[0]*5中选择最小的,选择2,即num[3] = 4,

依次进行如下操作,得到最终的结果。

class Solution {public:    /*     * @param n: An integer     * @return: the nth prime number as description.     */    int nthUglyNumber(int n) {        vector<int> Num(n);          Num[0] = 1;          int p2 = 0;          int p3 = 0;          int p5 = 0;          for(int i = 1;i<n;i++)          {              Num[i] = min(min(Num[p2]*2,Num[p3]*3),Num[p5]*5);      //找出是2,3,5中哪个计算出的Num[i],若2,3都能得出时,需要p2++,p3++            if(Num[i] / Num[p2] == 2)                  p2 ++;              if(Num[i] / Num[p3] == 3)                  p3 ++;              if(Num[i] / Num[p5] == 5)                  p5 ++;          }          return Num[n-1];      }};

参考:http://blog.csdn.net/lhanchao/article/details/52079323

原创粉丝点击