poj1338

Ugly
Numbers










Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 19952   Accepted: 8856

Description

Ugly numbers are numbers whose only prime factors
are 2, 3 or 5. The sequence 
1, 2, 3, 4, 5, 6, 8, 9, 10, 12,
... 
shows the first 10 ugly numbers. By convention, 1 is
included. 
Given the integer n,write a program to find and print the
n‘th ugly number.

Input

Each line of the input contains a postisive
integer n (n <= 1500).Input is terminated by a line with n=0.

Output

For each line, output the n’th ugly number .:Don’t
deal with the line with n=0.

Sample Input

1
2
9
0

Sample Output

1
2
10

Source

New Zealand 1990 Division I,UVA 136

这题题意好理解,给一个定义,某个数只能被2,3,5整除,这样的数叫做丑数,然后有这样一个丑数序列,给出n,让我们求出丑数序列中的第n个丑数。

这个题目直观上面有一个简单解法,我们只需要用这个数分别不停的除以2,3,5,直到number%2
or 3 or 5不为零为止,当除到最后,如果number =
1,则说明这个数是丑数,于是我们加入序列,或者数一个计数器累加,到最后输出,当然也可以先筛选出某个范围内的丑数,然后根据n直接对应输出。但是这样会超时,因为很多非丑数我们也进行了循环除法,效率太低。于是有更好的方法:

  我们想像筛选法挑选素数那样,以乘积进行扩展,所有的丑数都等于小于它的某个丑数*2 or *3
or *5得来,我们给一个数组,初始有一个丑数1,然后分别*2 *3
*5,这样确实可以得到所有丑数,但是第一不能保证有序,第二不能保证不重复,如果解决了这两个中任何一个问题就OK了,解决了有序,当然就不重复,解决了重复,利用STL
sort排序就OK了。下面是保证有序产生丑数,基本思路:

  

这种思路的关键在于怎样确保数组里面的丑数是排好序的。我们假设数组中已经有若干个丑数,排好序后存在数组中。我们把现有的最大丑数记做M。现在我们来生成下一个丑数,该丑数肯定是前面某一个丑数乘以2、3或者5的结果。我们首先考虑把已有的每个丑数乘以2。在乘以2的时候,能得到若干个结果小于或等于M的。由于我们是按照顺序生成的,小于或者等于M肯定已经在数组中了,我们不需再次考虑;我们还会得到若干个大于M的结果,但我们只需要第一个大于M的结果,因为我们希望丑数是按从小到大顺序生成的,其他更大的结果我们以后再说。我们把得到的第一个乘以2后大于M的结果,记为M2。同样我们把已有的每一个丑数乘以3和5,能得到第一个大于M的结果M3和M5。那么下一个丑数应该是M2、M3和M5三个数的最小者。

前面我们分析的时候,提到把已有的每个丑数分别都乘以2、3和5,事实上是不需要的,因为已有的丑数是按顺序存在数组中的。对乘以2而言,肯定存在某一个丑数T2,排在它之前的每一个丑数乘以2得到的结果都会小于已有最大的丑数,在它之后的每一个丑数乘以2得到的结果都会太大。我们只需要记下这个丑数的位置,同时每次生成新的丑数的时候,去更新这个T2。对乘以3和5而言,存在着同样的T3和T5

以上是借用:http://zhedahht.blog.163.com/blog/static/2541117420094245366965/ 
 感觉自己讲不出来。。

除了这种思路外,看到还有大牛用STL中的set自动删除重复元素,这样就更加简单了。

还有一种,纯粹为了A题目,利用第一种方法先得出题目给的1500范围内的所有丑数,然后打表,有点无赖的感觉

http://blog.csdn.net/coder_xia/article/details/6707600 
这个大牛总结了很多方法,值得借鉴。


 1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4
5 int Min(int a,int b,int c)
6 {
7 int temp = a>b?b:a;
8 return (temp>c?c:temp);
9 }
10
11 int main()
12 {
13 int n;
14 int Uglynumber[1502]={0,1};
15 int num_1=1,num_2=1,num_3=1;
16 for(int i = 2;i<=1501;i++)
17 {
18 Uglynumber[i]= Min(Uglynumber[num_1]*2,Uglynumber[num_2]*3,Uglynumber[num_3]*5);
19 if(Uglynumber[num_1]*2==Uglynumber[i])
20 {
21 num_1++;
22 }
23 if(Uglynumber[num_2]*3==Uglynumber[i])
24 {
25 num_2++;
26 }
27 if(Uglynumber[num_3]*5==Uglynumber[i])
28 {
29 num_3++;
30 }
31 }
32 while(scanf("%d",&n)!=EOF&&n!=0)
33 {
34 printf("%d\n",Uglynumber[n]);
35 }
36 return 0;
37 }

poj1338,布布扣,bubuko.com

时间: 2024-08-27 01:43:42

poj1338的相关文章

poj1338 Ugly Numbers(丑数模拟)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1338 Description Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... shows the first 10 ugly number

POJ1338 Ugly Numbers(解法二)

问题链接:POJ1338 Ugly Numbers.基础级练习题,用C语言编写程序. 题意简述:不能被2.3和5以外的素数整除的数称为丑数,找出第1500个丑数. 问题分析:换句话说,丑数的因子只能是2.3和5.1是丑数,对于x,若x是丑数则2x.3x和5x是丑数.利用已知的丑数,从小到不断生成丑数就可以了. 程序中,结果放在数组ans[]中,也是生产丑数的x:素数放在数组prime[]中,这个问题只有2.3和5:生成的丑数放在数组ugly[]中,然后选出最小的放入结果数组ans[]中,对于被放

POJ1338 Ugly Numbers

问题链接:POJ1338 Ugly Numbers.基础级练习题,用C++语言编写程序. 题意简述:不能被2.3和5以外的素数整除的数称为丑数,找出第1500个丑数. 问题分析:换句话说,丑数的因子只能是2.3和5.1是丑数,对于x,若x是丑数则2x.3x和5x是丑数.利用已知的丑数,从小到不断生成丑数就可以了. 程序中,使用一个STL的容器set来存放丑数.集合具有去重复,自动排序的功能,对于解决本问题是方便的.但是,set对象无法用下标访问,所以倒腾到vector对象中再使用.本问题打表是合

POJ1338 &amp; POJ2545 &amp; POJ2591 &amp; POJ2247

POJ1338 2545 2591 2247都是一个类型的题目,所以放到一起来总结 POJ1338:Ugly Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21708   Accepted: 9708 Description Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5

UVA 136 &amp; POJ1338 Ugly Numbers

题目大意: Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, - shows the first 10 ugly numbers. By convention, 1 is included. 把只含有2.3.5因数的数称为丑数,默认第一个丑数是1. POJ是有多次询问,输出第n个丑数 UVA是询问第1500个丑数是多少. 思路:

Ugly Numbers(POJ1338)(丑数,技巧性强)

Ugly Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20851   Accepted: 9248 Description Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ... shows the first 10 ugly num

【POJ1338】Ugly Numbers(暴力打表)

打表大军是一股邪恶势力→_→ 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <numeric> 8 #include <algorithm> 9 #include <limits.h&g

【优先队列基础练习】POJ1338 Uva136 - Ugly Numbers题解

昨天夜里学了栈.队列和优先队列,栈还有的地方不大懂,队列基本可以,优先队列很高兴.本想今天上午继续弄这个,但是跟着李晨他们一块听了清华交院罗雨屏老师讲的计算几何= =虽然以我的水平听计算几何有点早,但至少是听懂了很多,感觉很高兴:十点多就没有再听,毕竟之后越来越深亚历山大.于是就来写一下丑数的题解. 题目:除2,3,5外不能被其他素数整除的数为丑数,求第1500个丑数(Uva版),求第n(n<=1500)个丑数(POJ版) 思路:第一个是1,放入升序优先队列(小的先出),之后每次出队第一个元素,

POJ1338——丑数

问题 丑数是仅有素因子2.3和5的整数.序列1,2,3,4,5,6,8,9,10,12是前十个丑数.1被包含在丑数中. 输入 给出一个正整数n(n<=1500) 输入0表示结束 输出 对于输入的每一行,输出第n个丑数 分析 预先算出第1-1500个丑数存入数组中,从小到大排列,然后取出第n个输出即可. 由于丑数仅有2.3.5这三个因子,所以集合中的元素都是通过乘以2.3.5这三个因子扩展获得的. 比如: ugly[1] =1 ugly[2]=2 ,用第1个丑数 ugly[1]分别以从小到大的顺序