
上QQ阅读APP看书,第一时间看更新
3.6.2 代码改进——尝试找到第n个丑数

如果将丑数按照自然数的顺序来进行排序,正整数1是第一个丑数,现在输入一个数n,尝试编程找到第n个丑数。
本题是对前面判定丑数问题的升级,有了前面的基础,本题相对来说就容易很多。当然,采用暴力遍历的方式来寻找依然是不可行的,我们将上一道题的解题思路逆向思考,很容易就可以编写出解决本题的程序。
解题思路分析如下:
(1)首先定义一个数组,用来存放所有已经找到的丑数。
(2)使用3个变量分别用来记录对因数2、3和5相乘运算的位置。
(3)将找到的最小丑数放入数组,修改记录位置的变量,继续寻找,直到满足要求。
上面的解题过程实际上是解决寻找丑数问题的一个经典算法:三指针法。我们知道,丑数都是由2、3和5这3种质因数相乘得到的,从最小的丑数1开始,依次对2、3、5进行相乘,得到最小的数即下一个丑数,以此类推,可以得到完整的丑数列表。示例代码如下:

上面的代码的循环过程可以描述如下:

以此类推即可。