Humble Numbers(丑数) 超详解!
给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑数为 h[n]。
算法 1:
一种最容易想到的方法当然就是从 2 开始一个一个的判断一个数是否为丑数。这种方法的复杂度约为 O( k * h[n]),铁定超时(如果你这样做而没有超时,请跟 tenshi 联系)
算法 2:
看来只有一个一个地主动生成丑数了 :
我最早做这题的时候,用的是一种比较烂的生成方法,复杂度为 O( k * n * log(n) )。
算法流程如下:
1.初始化最小堆,内置一个元素 1
2.i=0 ,表示求第 i 个丑数(默认 h[0]=1)
3.if i>n then goto 7
4.取出堆中最小的元素 x(如果有多个最小元素,全部取出来), h[i]:= x,i:=i+1
5.把 x*p[1] , x*p[2] ... ,x*p[n] 放入堆中
6.goto 3
7.结束
这个算法要使用一个最小堆(Heap)的数据结构,。不会超时。
算法 3:
算法2虽然速度还可以,但是算法复杂度还是有点高。这里介绍一下 UsacoGate 提供的标准程序的算法。首先我们知道这样的东西:如果前 m-1 个丑数已经求出来了(包含 0),那么第 m 个数肯定是由前面某个丑数乘 S 里的素数得来的。假设是 h[pindex[i]] 乘 p[i] 而得到 h[m] 的话,把每次乘 p[i] 的 pindex[i] 列出来,肯定是单调的!利用这个,我们可以得到这样的算法:
1.nhum=0 ,表示求第 nhum 个丑数(默认 h[0]=1)
2.令 pindex[i]=0 ,表示一开始无论怎么乘,都是乘 h[0]
3.if (nhum > n ) then goto 7
4.分别求出 h[pindex[i]]*p[i]的值,找出比 h[nhum-1] 大的最小值
5.把这个最小值 h[pindex[minp]]*p[minp] 存入 h[nhum]
6.nhum:=nhum+1;
7.结束
这个算法复杂度显然为 O( n * k ),已经相当不错了
以上是某个博客的做题心得吧!我把他引用过来仅仅为了介绍丑数的概念
我就以一道例题介绍丑数吧!
description |
只有质数2,3,5,7这几个作为因子的数叫做,丑数,比如前20个丑数是(从小到大来说) 1,2,3,4,6,7,8,9,10,12,14,15,16,18,20,21,24,25和27. |
input |
我们给你个n(1<=m<=5842)当输入n为0结束。 |
output |
输出第n个丑数。每个数一行。 |
sample_input |
1 |
sample_output |
1 关于丑数的含义在题目中已有解释,有的题目中忽略了“7”这个质因子,其实这都不是最重要的重要的是掌握其处理的方法。 首先,判断一个数是否为丑数的方法如下: int find_uglynum(int a) 但是这种方法过于费时,下面给出该题解题思路: 首先,第一个丑数为“1”,后面的每一个丑数都是由前一个丑数乘2、3、5或7而来,那么后一个丑数就是前一个乘这四个数得到的最小值,for example:第一个:1,第二个:1*2、1*3、1*5或1*7,显然为2,第三个:2*2,1*3,1*5或1*7,显然是3,第四个:2*2,,2*3,1*5,1*7为4,第五个:3*2,2*3,1*5,1*7…… 聪明的你是否看明白了呢? 下面给出本题的代码: #include <iostream> |
Humble Numbers(丑数) 超详解!的更多相关文章
- Mysql超详解
Mysql超详解 一.命令框基本操作及连接Mysql 找到Mysql安装路径,查看版本 同时按快捷键win+R会弹出一个框,在框中输入cmd 点击确定后会出现一个黑框,这是命令框,我们的操作要在这命令 ...
- Python3调用C程序(超详解)
Python3调用C程序(超详解) Python为什么要调用C? 1.要提高代码的运算速度,C比Python快50倍以上 2.对于C语言里很多传统类库,不想用Python重写,想对从内存到文件接口这样 ...
- JUC中的AQS底层详细超详解
摘要:当你使用java实现一个线程同步的对象时,一定会包含一个问题:你该如何保证多个线程访问该对象时,正确地进行阻塞等待,正确地被唤醒? 本文分享自华为云社区<JUC中的AQS底层详细超详解,剖 ...
- html5的float属性超详解(display,position, float)(文本流)
html5的float属性超详解(display,position, float)(文本流) 一.总结 1.文本流: 2.float和绝对定位都不占文本流的位置 3.普通流是默认定位方式,就是依次按照 ...
- HTML中DOM核心知识有哪些(带实例超详解)
HTML中DOM核心知识有哪些(带实例超详解) 一.总结: 1.先取html元素,然后再对他进行操作,取的话可以getElementById等 2.操作的话,可以是innerHtml,value等等 ...
- Mybatis案例超详解(上)
Mybatis案例超详解(上) 前言: 本来是想像之前一样继续跟新Mybatis,但由于种种原因,迟迟没有更新,快开学了,学了一个暑假,博客也更新了不少,我觉得我得缓缓,先整合一些案例练练,等我再成熟 ...
- 高斯消元法(Gauss Elimination)【超详解&模板】
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...
- DES加密 超详解 及 C++编程实现
参考资料: 1.计算机与软件学院实验报告管理系统资料 2.强烈推荐观看:<信息安全技术>课程微课设计 简介 什么是DES DES全称为Data Encryption Standard,即数 ...
- POJ 1659 Frogs' Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 9897 Accepted: 41 ...
随机推荐
- 重拾python
前一段碰到几次关于日期计算的题:给出一个日期,计算下一天的日期.虽然不限语言,可是我就C/C++还算熟悉,别的都是刚了解皮毛,根本不会用现成的库啊,无奈啊...只好用c语言一点点实现了,当时真是无比怀 ...
- css--用户体验笔记及兼容记录
css用户体验 1.HTML的< >&"©分别是<,>,&,",©;的转义字符 2.IE8和7的透明度 filter: progid:DXI ...
- java的HashCode和equals
什么时候用到hashcode,什么时候用到equals? 首先java为每个对象都生成有默认的hashcode,这个java core里说是java对象的内存地址,但是equals方法里比较的也是对象 ...
- java8 泛型声明 The diamond operator ("<>") should be used
The diamond operator ("<>") should be used Java 7 introduced the diamond operator (& ...
- UVa 11503 - Virtual Friends
题目大意:给出若干对朋友关系,每给出一对朋友关系,就输出二者所在关系网中的人数. 首先是对每个人编号,使用map简化编号过程,然后就是使用并查集更新集合.要注意的是当给出A和B的朋友关系时,无论A和B ...
- ubuntu系统内核替换
此处将内核由高版本替换成低版本.替换前的系统为ubuntu 12.04 kernel 3.8.0. 替换后的内核版本为2.6.35. 首先下载需要替换的内核文件,下载链接:https://www.ke ...
- jQuery初始化
jQuery 初始化的理解 var jQuery = function( selector, context ) { // The jQuery object is actually just the ...
- window 2008+apache2.4.4+php5.5+mysql-5.6.12+phpmyadmin4.0.4.1安装过程(参考他人文章基础上加上自己遇到的问题)
一.window server2008的安装 1.我用U盘安装的,先用UltraISO把server2008刻录到U盘中,过程我搜了一下,帖个地址: http://wenku.baidu.com/vi ...
- JavaScript 开发工具webstrom使用指南
本文给大家推荐了一款非常热门的javascript开发工具webstrom,着重介绍了webstrom的特色功能.设置技巧.使用心得以及快捷键汇总,非常的全面. 看到网上一篇介绍webstrom的文章 ...
- Oracle 11g RAC使用Manual和Policy Managed方法配置(转)
原文地址:http://czmmiao.iteye.com/blog/2128771 软件环境: 操作系统:Red Hat Enterprise Linux 5.4(Tikanga)Oracle:11 ...