题目1214:丑数
来源:互联网 发布:你ㄚ上瘾了 网络剧 编辑:程序博客网 时间:2024/05/09 08:17
这个算法是从别人那里学到的,链接地址:http://blog.163.com/xie_wenbin613/blog/static/17548909520124280049635/
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数。 写一个高效算法,返回第n个丑数。
最普通(也最耗时)的做法是从1开始遍历,然后判断这个数的因式分解中只包含2,3,5,满足则找到了一个,一直找下去,直到第n个被 找出!测试了一下,找第1500个丑数耗时40秒!
分析:假设数组ugly[N]中存放不断产生的丑数,初始只有一个丑数ugly[0]=1,由此出发,下一个丑数由因子2,3,5竞争产生,得到ugly[0]*2, ugly[0]*3, ugly[0]*5, 显然最小的那个数是新的丑数,所以第2个丑数为ugly[1]=2,开始新一轮的竞争,由于上一轮竞争中,因子2获胜,这时因子2应该乘以ugly[1]才显得公平,得到ugly[1]*2,ugly[0]*3,ugly[0]*5, 因子3获胜,ugly[2]=3,同理,下次竞争时因子3应该乘以ugly[1],即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5获胜,得到ugly[3]=5,重复这个过程,直到第n个丑数产生。总之:每次竞争中有一个(也可能是两个)因子胜出,下一次竞争中 胜出的因子就应该加大惩罚!
C++代码:
#include<stdlib.h>#include<stdio.h>int ugly[1510];int count=0;int myMin(int a,int b,int c){int t=a<b?a:b;return t<c?t:c;}void init(){ugly[0]=1;count++;int index2=0,index3=0,index5=0;while(count<1501){int value=myMin(ugly[index2]*2,ugly[index3]*3,ugly[index5]*5);if(value==ugly[index2]*2)index2++;if(value==ugly[index3]*3)index3++;if(value==ugly[index5]*5)index5++;ugly[count++]=value;}}int main(){init();int n;while(scanf("%d",&n)!=EOF)printf("%d\n",ugly[n-1]);return 0;}
0 0
- 题目1214:丑数
- 题目1214:丑数
- 题目1214:丑数
- 题目1214:丑数
- 题目1214:丑数
- 丑数_题目1214:丑数
- 题目1214:丑数-九度
- 九度 题目1214:丑数
- 九度OJ-题目1214:丑数
- 笔试题目-丑数
- 题目34:丑数
- 题目:丑数
- 算法题目---丑数
- google面试题目:寻找丑数
- 剑指offer面试题目:丑数
- 【剑指Offer面试编程题】题目1214:丑数--九度OJ
- google面试题目:寻找丑数的实现
- HDOJ题目1058Humble Numbers(数学,丑数)
- Reverse Engineering the iBeacon Profile
- 为什么要写技术博
- 指针和数组
- 程序员妻子的自述
- alsa音频开发全攻略
- 题目1214:丑数
- HTML URL 编码
- handler异步机制学习总结
- 购票解读——3
- viatc 快捷键
- [Leetcode] Largest Rectangle in Histogram (Java)
- 命令行查看memcache状态
- Js与下拉列表处理问题
- ShareSDK for iOS 2.8.2发布