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

 方法一:

       如果一个数能被2整除,把它连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就连续除以5。如果最后得到的结果是1,那么这个数就是丑数。

public class Solution{
      public static boolean isUgly(int number){
            if(number<=0){
                  return false;
            }
            while(number%2==0){
                  number/=2;
            }
            while(number%3==0){
                  number/=3;
            }
            while(number%5==0){
                  number/=5;
            }
            return number==1?true:false;
      }

      public static int getUglyNumber(int index){
            if(index<=0){
                  return 0;
            }
            int number=1;
            int times=1;
            while(times<index){
                  number++;
                  if(isUgly(number)){
                       times++;
                  }
            }
            return number;
      }

      public static void main(String[] args){
           int number=getUglyNumber(10);
           System.out.println(number);
      }
}

方法二(效率高):

        创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2,3或者5得到的。如果上一丑数是M,那么把一个乘以2大于M的结果记为M2,同样把已有的每个丑数乘以3和5,能得到第一个大于M的结果M3和M5,那么下一个丑数应该是M2,M3和M5这3个数的最小者。

public class Solution{
      public static int getUglyNumber(int index){
            if(index<=0){
                  return 0;
            }
            int[] numbers=new int[index];
            numbers[0]=1;
            int times=1;
            int n2=1;
            int n3=1;
            int n5=1;
            while(times<index){
                  int min=min(n2*2,n3*3,n5*5);
                  numbers[times]=min;
                  while(n2*2<=min){
                       n2++;
                  }
                  while(n3*3<=min){
                       n3++;
                  }
                  while(n5*5<=min){
                       n5++;
                  }
                  times++;
            }
            int uglyNumber=numbers[times-1];
            return uglyNumber;
     }

     public static int min(int n1,int n2,int n3){
            int min=n1>n2?n2:n1;
            min=min>n3?n3:min;
            return min;
     }

     public static void main(String[] args){
            int uglyNumber=getUglyNumber(10);
            System.out.println(uglyNumber);
     }
}

 

 posted on 2018-11-21 22:20  会飞的金鱼  阅读(108)  评论(0)    收藏  举报