给定一个素数集合 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
2
3
4
11

sample_output

1
2
3
4
12
关于丑数的含义在题目中已有解释,有的题目中忽略了“7”这个质因子,其实这都不是最重要的重要的是掌握其处理的方法。
首先,判断一个数是否为丑数的方法如下:
 1 int find_uglynum(int a)2 {3     while(a%2==0)//将这个数中的质因子 2 耗尽4        a/=2;5     while(a%3==0) 6        a/=3;7     while(a%5==0)8        a/=5;9     while(a/7==0)
10        a/=7;
11     if(a==1)
12        return 1;
13     else
14        return 0;
15 }

但是这种方法过于费时,下面给出该题解题思路:
         首先,第一个丑数为“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……   聪明的你是否看明白了呢?
下面给出本题的代码:
 1 #include <iostream>2 #include <cstdio>3 using namespace std;4 #define min(a,b) ((a)<(b)?(a):(b))5 #define min4(a,b,c,d) min(min(a,b),min(c,d))6 int a[5850];7 int main()8 {9     //freopen("data.in","r",stdin);
10     //freopen("data.out","w",stdout);
11
12     int n=1;
13
14     int p2,p3,p5,p7;
15     p2=p3=p5=p7=1;
16     a[1]=1;
17     while(n<5843)//枚举5842个丑数,放在数组a里。
18     {
19         a[++n]=min4(2*a[p2],3*a[p3],5*a[p5],7*a[p7]);//从现在枚举的4个丑数里,先选择小的放在a里。
20         if(a[n]==2*a[p2])p2++;//如果a[n]==2*a[p2],2*a[p2]可能是吧a[n]枚举出的数,这样p2++,也可能是重复的枚举,这样也是p2++,总之p2++。
21         if(a[n]==3*a[p3])p3++;//同理。
22         if(a[n]==5*a[p5])p5++;//同理。
23         if(a[n]==7*a[p7])p7++;//同理。
24     }
25     while(scanf("%d",&n)&&n)
26     {
27         printf("%d\n",a[n]);//要谁找谁。
28     }
29     return 0;
30 }

转载于:https://www.cnblogs.com/yechanglv/p/6941971.html

Humble Numbers(丑数) 超详解!相关推荐

  1. usaco ★Humble Numbers 丑数

    ★Humble Numbers 丑数 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于 S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p ...

  2. (HDU)1058 --Humble Numbers( 丑数)

    题目链接:http://vjudge.net/problem/HDU-1058 这题有点难度,自己写了半天依旧TLE,参考了其他人的博客. http://blog.csdn.net/pythonfx/ ...

  3. C/C++实现蛇形矩阵(超详解)【沈七】

    C/C++实现蛇形矩阵(超详解) 题目链接 题目描述 输入样例 题解部分 完整代码 完结散花 悄悄告诉你: 参考文章 萌新报道! 唤我沈七就行嘿嘿. 大一软件工程在读. 菜鸡蒟蒻想在博客中记录一些算法 ...

  4. js打印三角形超详解

    js打印三角形超详解 j控制星星的总行数,i控制每行星星的打印个数 打印图形如下: (1) (2) //str=""用来存储星星// 理解步骤1:在一行输出6个星星如何操作,在循环 ...

  5. 线性规划之单纯形法【超详解+图解】-转载

    线性规划之单纯形法[超详解+图解] 目录 1.作用 2.线性规划的一般形式 5.1几何意义 5.2如何判断最优 5.3如何选择新的基变量 5.4如何选择被替换的基变量 5.5终止条件 标准型: 转化为 ...

  6. JAVA 多线程并发超详解

    JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...

  7. C/C++实现回文质数(超详解)【沈七】

    C/C++实现回文质数(超详解) 题目链接 题目描述 输入样例 **题解部分** **完整代码** **未完待续** 参考文章 唤我沈七就行嘿嘿. 大一软件工程在读. 菜鸡蒟蒻想在博客中记录一些算法学 ...

  8. C语言 中的 数据类型 超详解

    C语言 中的 数据类型 超详解 一.整型(int.short.long.long long) 1.有符号整型 有符号整型的数据类型通常包括 int.short.long.long long 四种,因为 ...

  9. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

最新文章

  1. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.
  2. HTC推出新款VR头显,奇怪的是只在日本销售
  3. feign 第一次调用超时_Feign ,3步搞定 HTTP 请求
  4. pandas DataFrame 索引(二)
  5. SAP信贷出口(用户1,2,3)
  6. mac 上安装Homebrew
  7. 详解fianl,finally,finalize关键字
  8. redis expire超时操作
  9. docker pull 私有_Docker系列教程03Docker私有仓库搭建(registry)
  10. unittest 测试
  11. 配置jdk与maven环境变量
  12. RestAsured测试框架
  13. blob形式导出Excel
  14. Python爬取某宝商品数据案例:100页的价格、购买人数等数据
  15. Java8新特性总结
  16. 雷电9模拟器安装抓包工具whistle证书
  17. Windows10 任务栏网络图标消失不见的解决办法
  18. Codepage的定义和历史
  19. STM32F103—有关BH1750(GY-302)环境光强度传感器模块的代码
  20. 2011Android技术面试整理附有详细答案(包括百度、新浪、中科软等多家公司笔试面试题)

热门文章

  1. android 自定义绘画,【整理】Android 自定义视图之画图
  2. RHEL6_yum本地源配置
  3. sql full left right inner cross 基础
  4. 《nftables相比iptables到底改变了什么》-- (作者:blog.csdn.net/dog250)
  5. Portal: 西电捷通TISec®技术
  6. 地理类国际顶级期刊汇总
  7. 关于遥感图像的控制点片匹配算法的一点想法(一)
  8. php让符合条件的复选框选中,多条件查询(复选框条件)
  9. mysql——event定时任务
  10. ArcGIS Maritime 发布海图切片服务详解