折叠

寻找丑数

1、题目要求:

  我们把只包含因子2、3和5的数称作丑数(Ugly Number),求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。

  提示:丑数= (x、y、z大于等于0的整数)

 

  输出第1500个丑数。

2、设计思路:

  传统方法(1)通过创建循环,连续%2、%3、%5得出最后的余数。

                      (2)如果最终的余数为0,即可确定最终的丑数。

                      (3)确定丑数的过程中加入变量限定丑数的个数即可。

  改进方法(1)选取最小丑数1,将其分别乘2/3/5得到对应的新丑数。

      (2)分别用三个变量来表示最近一个丑数*2/*3/*5得到的丑数

      (3)当三个变量中其中的最小值被选作丑数时,该数应该自增,方便下次作为索引值继续乘对应的数据,避免数据重复乘法运算

3、源代码:

package cn.test.termtest.uglynumber;

public class Ugly {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(GetUglyNumber1(1500));
    }
    public static int GetUglyNumber1(int index) {
        if(index <7)
            return index;
        int ugly[] = new int[index];  //定义一个数组,用来存放每一个元素。
        ugly[0] =1;      //第一个丑数
        int m2 =0;       //最近一次乘2得到的丑数
        int m3 =0;       
        int m5 =0;
        for(int i=1; i< index;i++) {
            ugly[i] = Math.min(ugly[m2] * 2,Math.min(ugly[m3] * 3,ugly[m5] * 5));
            if(ugly[i]==ugly[m2] * 2)
                m2++;
            if(ugly[i]==ugly[m3] * 3)
                m3++;
            if(ugly[i]==ugly[m5] * 5)
                m5++;
        }
        return ugly[index - 1];
    }
    
}

 

posted @ 2020-06-21 09:44  Coverpast  阅读(796)  评论(0编辑  收藏  举报