丑数--Ugly Number:整数因数分解只包含2,3,5的数
思路一:将待测整数不断的进行2,3,5的分解,如果最终的数为1,该数便是丑数。
思路二:利用筛选法求解丑数,2、3、5的倍数可能是丑数,在2、3、5倍数中去掉不是丑数的剩余的全是丑数。丑数的丑数倍数便是丑数,将丑数再乘上一个丑数,得到的结果一定会是丑数。采用这样的方法可以把一定范围的丑数全部得到。
import java.util.Scanner;
/**
* 因子只包含2、3、5的数称为丑数
* @author Administrator
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
// boolean isUglyNumber = IsUglyNumber(sc.nextInt());
// System.out.println(isUglyNumber);
int num = sc.nextInt();
boolean[] isUgly = new boolean[num+1];
ContinueUglyNumber(num,isUgly);
for(int index = 2; index <= num; ++index) {
if(isUgly[index])
System.out.print(index+" ");
}
System.out.println();
}
}
// 暴力求解,每个数都要进行计算。
public static boolean IsUglyNumber(int num) {
while(num%2 == 0) num /= 2;
while(num%3 == 0) num /= 3;
while(num%5 == 0) num /=5;
if(num == 1) return true;
return false;
}
// 筛选法进行丑数的查找
public static void ContinueUglyNumber(int num,boolean[] isUgly) {
isUgly[2] = true;
isUgly[3] = true;
isUgly[5] = true;
int index2 = 1;
int index3 = 1;
int index5 = 1;
while(index2*2<=num) {
if(isUgly[index2]) isUgly[index2*2]=true;
index2++;
}
while(index3*3<=num) {
if(isUgly[index3]) isUgly[index3*3]=true;
index3++;
}
while(index5*5<=num) {
if(isUgly[index5]) isUgly[index5*5]=true;
index5++;
}
}
}