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. 1
  2. 2
  3. 9
  4. 0

Sample Output

  1. 1
  2. 2
  3. 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[]={,};
  15. int num_1=,num_2=,num_3=;
  16. for(int i = ;i<=;i++)
  17. {
  18. Uglynumber[i]= Min(Uglynumber[num_1]*,Uglynumber[num_2]*,Uglynumber[num_3]*);
  19. if(Uglynumber[num_1]*==Uglynumber[i])
  20. {
  21. num_1++;
  22. }
  23. if(Uglynumber[num_2]*==Uglynumber[i])
  24. {
  25. num_2++;
  26. }
  27. if(Uglynumber[num_3]*==Uglynumber[i])
  28. {
  29. num_3++;
  30. }
  31. }
  32. while(scanf("%d",&n)!=EOF&&n!=)
  33. {
  34. printf("%d\n",Uglynumber[n]);
  35. }
  36. return ;
  37. }

poj1338的更多相关文章

  1. [POJ1338]Ugly Numbers

    [POJ1338]Ugly Numbers 试题描述 Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequ ...

  2. POJ1338 &amp; POJ2545 &amp; POJ2591 &amp; POJ2247 找给定规律的数

    POJ1338 2545 2591 2247都是一个类型的题目,所以放到一起来总结 POJ1338:Ugly Numbers Time Limit: 1000MS   Memory Limit: 10 ...

  3. POJ1338 & POJ2545 & POJ2591 & POJ2247

    POJ1338 2545 2591 2247都是一个类型的题目,所以放到一起来总结 POJ1338:Ugly Numbers Time Limit: 1000MS   Memory Limit: 10 ...

  4. 【POJ1338】Ugly Numbers(暴力打表)

    打表大军是一股邪恶势力→_→ #include <iostream> #include <cstring> #include <cstdlib> #include ...

  5. poj1338 Ugly Numbers 打表, 递推

    题意:一个数的质因子能是2, 3, 5, 那么这个数是丑数. 思路: 打表或者递推. 打表: 若该数为丑数,那么一定能被2 或者3, 或者5 整除, 除完之后则为1. #include <ios ...

  6. poj1338【丑数·DP】

    我记得这道题以前写过,而且是写出来了.DP吧. 然后现在想了好久...没想出来.... 然后考虑一下递推..mdzz-直接就是让之前的这个每次乘以2,3,5就好了嘛,然后每轮取最小. //#inclu ...

  7. 11月下旬poj其他题

    poj1000,poj1003,poj1004,poj1064,poj1218 水题 poj1012:0<k<14——漂亮的打表 poj1651:与能量项链很像的dp poj1159:回文 ...

  8. OJ题目分类

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...

  9. DP50题(转)

    转自https://www.luogu.org/blog/cccx2016/dp50-ti-ti-hao dp50题: poj1014 poj1015 poj1018 poj1036 poj1038 ...

随机推荐

  1. 定制化Azure站点Java运行环境(1)

    Azure website提供了为现代化的web应用程序快速部署的PAAS平台,可以让用户几分钟之内快速的将自己的应用部署到云端,并且提供了自动扩展(auto-scaling),SSL,多种语言(Ja ...

  2. 微软云基础架构Hyper-scale Datacenter

    每天醒来,可能很多人的习惯都是打开手机,看看微信,刷刷朋友圈,或者看看新闻,去咖啡店,打开电脑搜索一些关键字,观看视频,电视剧--可是你有没有想过你每一次键盘的敲击,每一次微信的语音的发送,数据会流向 ...

  3. fragment低版本

    http://bbs.csdn.net/topics/390271980 Fragment框架开发东西确实很方便,但是恼人的是从4.0才开始支持.以前的版本必须用兼容模式开发,本人在网上找了大量资料, ...

  4. 为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数?

    为什么在DllMain里不能调用LoadLibrary和FreeLibrary函数? MSDN里对这个问题的答案十分的晦涩.不过现在我们已经有了足够的知识来解答这个问题.考虑下面的情况:       ...

  5. 不是技术牛人,如何拿到国内IT巨头的Offer

    原地址:http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些 ...

  6. cdoj 491 Tricks in Bits

    //无脑爆居然能过!!!!! 解:其实正解也是暴力,但是可以证明在n>6时答案一定为零. 第一步:对于任意两个数他们的二进制数要么有一半+的位是相同的,要么有一半+的位是不同的,于是首先使用与运 ...

  7. 静态查找_Search

    #include <stdio.h> #define MAXSIZE 50 #define OK 1 #define ERROR 0 int F[MAXSIZE];//斐波那契数列 int ...

  8. 杭电oj 2037 今年暑假不AC

    Tips:贪心算法的典型应用,可以按照节目结束时间由小到大排序,(至于结束时间相同的,有些人说按开始时间早的排序,不过个人认为不必处理,因为结束时间一样,两个之中要么都没有,要么必有一个)然后再依次进 ...

  9. 【LeetCode练习题】Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  10. 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)

    第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...