栗子:求第n个丑数
丑数就是只包含因子2,3,5的数(Ugly Number)
public static void main(String[] args) throws ParseException {
System.out.println("求第n个丑数");
int n = new Scanner(System.in).nextInt();
long r = f(n);
System.out.println(r);
}
private static long f(int n){
//计数变量
int count = 0;
//保存结果变量
long r = 0;
//无限循环从3开始递增
for(int i=3;;i++){
//判断i是不是丑数
//新的变量保存i的值
int j = i;
while(j%2==0){
j/=2;
}
while(j%3==0){
j/=3;
}
while(j%5==0){
j/=5;
}
if(j==1){
//i是整数
count++;
if(count == n){
r = i;
break;
}
}
}
return r;
}
输出结果
300
86400
栗子:求第n个丑数(效率高版本)
1、准备3个集合,先分别放入2、3、5
2
3
5
2、把最小值取出来,分别乘2、3、5,分别放入3个集合
4
3、6
5、10
2
3、重复以上步骤,取出最小值,分别乘2、3、5,分别放入3个集合
4、6、
6、9、
5、15、
2 3
6、8、
6、9、12、
5、15、20、
2 3 4
4、重复以上步骤
有重复的最小值都要取出
8、12、
9、12、18
5、15、20、30、
2 3 4 6
……
5、第一次执行得到第1个丑数,第二次执行得到第2个…第n次执行得到第n个丑数
public static void main(String[] args) throws ParseException {
System.out.println("求第n个丑数");
int n = new Scanner(System.in).nextInt();
long r = f(n);
System.out.println(r);
}
private static long f(int n){
//创建3个集合
LinkedList<Long> list2 = new LinkedList();
LinkedList<Long> list3 = new LinkedList();
LinkedList<Long> list5 = new LinkedList();
//初始值分别放入2、3、5
list2.add(2L);
list3.add(3L);
list5.add(5L);
//保存结果
long r = 0;
for(int i=1;i<=n;i++){
//访问3个头部值
long a = list2.getFirst();
long b = list3.getFirst();
long c = list5.getFirst();
//最小值赋给r
r = Math.min(a, Math.min(b, c));
//移除最小值
if(r==a){
list2.removeFirst();
}
if(r==b){
list3.removeFirst();
}
if(r==c){
list5.removeFirst();
}
//r分别乘2、3、5放入三个集合
list2.add(r*2);
list3.add(r*3);
list5.add(r*5);
}
return r;
}
输出结果
求第n个丑数
1000
51840000