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的主要内容,如果未能解决你的问题,请参考以下文章
UVA 136 & POJ1338 Ugly Numbers
递推:POJ中的三道递推例题POJ 1664POJ 2247和POJ 1338