关于丑数
? ? 我們將只包含因子2,4,5的數(shù)稱為丑數(shù),比如1, 2, 3, 4, 5, 6, 8, 9, 10, 12等等就是丑數(shù),現(xiàn)在我們來求出從小到大排列的第N個丑數(shù)。
? ? 下面提供一種思路,來源于http://www.geeksforgeeks.org/ugly-numbers/。
public int nthUglyNumber(int n) {if(n<=0) return 0;int i2=0,i3=0,i5=0;List<Integer> ugly = new ArrayList<Integer>();ugly.add(1);while(ugly.size()<n){int next_val = Math.min(ugly.get(i2)*2,Math.min(ugly.get(i3)*3,ugly.get(i5)*5));ugly.add(next_val);if(ugly.get(i2)*2==next_val) i2++;if(ugly.get(i3)*3==next_val) i3++;if(ugly.get(i5)*5==next_val) i5++;}return ugly.get(ugly.size()-1);}算法的基本思想就是按從小到大的順序產(chǎn)生丑數(shù),那么如何產(chǎn)生呢?
首先我們初始化一個用來保存丑數(shù)的list,第一個丑數(shù)是1,然后我們用2,3,5去乘以1,得到2,3,5,接著我們從2,3,5中選出下一個丑數(shù),選擇的依據(jù)是這3個數(shù)中最小的,得到2,那么2就是第二個丑數(shù)了,由于選擇的是2這個因子對應(yīng)的數(shù),我們將i2加一,
現(xiàn)在我們有1,2兩個丑數(shù)了,繼續(xù)進(jìn)行循環(huán),執(zhí)行這一句
int next_val = Math.min(ugly.get(i2)*2,Math.min(ugly.get(i3)*3,ugly.get(i5)*5));得到4,3,5,選出最小的3,得到下一個丑數(shù)3,同上由于選擇的是3這個因子對應(yīng)的數(shù),我們將i3加一。繼續(xù)循環(huán),直到得到第n個丑數(shù)。
轉(zhuǎn)載于:https://www.cnblogs.com/jfwu/p/5564207.html
總結(jié)
- 上一篇: Delphi调用外部程序的集中方法
- 下一篇: 1 张图秒懂 Nova 16 种操作 -