import java.util.LinkedList;
import java.util.Scanner;
public class TestChou {
public static void main(String[] args) {
System.out.println("求第几个丑数:");
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
long r=f(n);
System.out.println(r);
sc.close();
}
private static long f(int n) {
/**
* -------------------------
* 准备3个集合
* ----------------------------
* 3| 9 (15) [21]
* -----------------------------
* 5| (15) [25] @35@
* -----------------------------
* 7| 21 @35@ 49
* ----------------------------
*
* 3
* 取最小值
* *3 *5 *7 往集合放
*
* 5
* 取最小值
* *3 *5 *7
*
* 7
* 取最小值
* *3 *5 *7
*
* 9
* 取出最小值
* *3 *5 *7
*/
//创建3个集合
LinkedList<Long>list3=new LinkedList<Long>();
LinkedList<Long>list5=new LinkedList<Long>();
LinkedList<Long>list7=new LinkedList<Long>();
list3.add(3L);list5.add(5L);list7.add(7L);
long r=0;//用来保存每次求的的丑数
//求丑数,从第一个求到第n个
for (int i = 1; i <=n; i++) {
//访问头部值
Long a = list3.getFirst();
Long b = list5.getFirst();
Long c = list7.getFirst();
//得到最小值
r=Math.min(a, Math.min(b, c));
//判断r是a,b,c中的哪些,是什么移除什么,移除最小值
if(r==a)list3.removeFirst();
if(r==b)list5.removeFirst();
if(r==c)list7.removeFirst();
//最小值,乘以3,5,7放入集合
list3.add(r*3);
list5.add(r*5);
list7.add(r*7);
}
return r;
}
}
运行结果
求第几个丑数:
20
189