POJ 1338

Posted smile_to_warm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1338相关的知识,希望对你有一定的参考价值。

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();
	}

}

  

 

POJ题目总结

 (1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
(1)枚举. (poj1753,poj2965)
(2)贪心(poj1328,poj2109,poj2586)
(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)

简单模拟
1006, 1008, 1013, 1016, 1017, 1169, 1298, 1326, 1350, 1363, 1676, 1786,
1791, 1835, 1970, 2317, 2325, 2390,

以上是关于POJ 1338的主要内容,如果未能解决你的问题,请参考以下文章