达内课程-求第n个丑数

栗子:求第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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值