POJ 1338 - Ugly Numbers 

描述
丑陋的数字是只有素数为2、3或5的数字
序列 : 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... 显示前10个丑陋的数字。按照惯例,1包括在内。
给定整数n,编写一个程序来查找并打印第n个丑陋的数字。

输入
输入的每一行都包含一个正整数n (n <= 1500)。
输入由一个n=0的行终止。

输出
对于每一行,输出第n个丑陋的数字:不要处理n=0的行。

 

思路:反向思维,先对数进行*2,*3,*5,将所得的数,保存到set或者pq, 自动排序,再取出,每个取出最小值 

 

package basic_data_structure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;

/**
 * 
 * @author XA-GDD
 * 
 ** 思路:反向思维,先对数进行*2,*3,*5,将所得的数,保存到set或者pq, 自动排序,再取出,每个取出最小值 
 *
 */
public class B_UglyNumbers {

	static int N;
	static long [] uglyNumb = new long[1502];
	static TreeSet<Long> set = new TreeSet<Long>();
	public static void main(String[] args) throws NumberFormatException, IOException {       
		set.add(1L);
		uglyNumb[0]=1;
		getUglyNumb();	
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;      
		while((str = br.readLine()) != null){
			N = Integer.parseInt(str);
			if(N==0)  break;					
			System.out.println(uglyNumb[N]);
		}		
	}
	
	static void getUglyNumb() {	
		int numb=1;
		while(numb<=1500) {
			createUglyNumb(numb);
			numb++;
		}		
	}
	
	static void  createUglyNumb(int numb) {
		set.add(uglyNumb[numb-1]*2);
		set.add(uglyNumb[numb-1]*3);
		set.add(uglyNumb[numb-1]*5);		
		uglyNumb[numb] = set.pollFirst();
	}

}