什么是丑数:

一个数的因子只包含2,3,5的数称为丑数。数字1特别对待也看作是丑数,所以从1开始的10个丑数分别为1,2,3,4,5,6,8,9,10,12。


因子的概念:

整数m除以n,得到无余数的商,则称n是m的一个因子。如8的因子有1、2、4、8。而丑数要求的因子只包含2、3、5。所以丑数中的因子应理解为质因子。即因子为质数,质数又称素数,指一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。与质数相对应的数称为合数。

现在要求写一个程序,输出从1开始的第N个丑数。如第一个丑数为1,第二个丑数为2,第十个丑数为12


判断是否是丑数的算法

设待判断整数位M,M循环除以2直到不能整除,此时接着循环除以3直到不能整除,接着循环除以5直到商为1或者不能整除为止。商为1且余数为0则为丑数,否则为非丑数。

如:丑数12

12/2 = 6

6/2 = 3;

3/2 不能整除

3/3 = 1; 结束,12是丑数

非丑数26

26/2 = 13

13/2 不能整除

13/3 不能整除

13/5 不能整除

结束,26不是整数


寻找丑数算法1:

(1)设置一个计数器用来统计出现的丑数的个数

(2)从1开始遍历每一个整数,判断是否是丑数,如果是丑数则计数器加1,否则遍历下一个整数。

(3)当计数器的值=N时,停止遍历,输出丑数。

#include <stdio.h>
#include <time.h>
#include <string.h>int isUgly(int number){ //判断number是否是丑数while(number%2==0){ //判断数能否被2整除number=number/2; }while(number%3==0){ //判断数能否被3整除number=number/3;}while(number%5==0){ //判断数能否被5整除number=number/5;}if(number == 1) //return 1;elsereturn 0;
}int findUgly(int N){  //寻找从1开始的第N个丑数int count=0; //用于计数int number=1; //从1开始遍历while(1){if(isUgly(number)){  //如果number是丑数计数器加1count++;}if(count == N)  //找到第N个丑数,返回丑数return number;elsenumber++; }
}void main(){int N=0;scanf("%d",&N);clock_t start = clock();printf("%d\n",findUgly(N));clock_t stop = clock();printf("耗时:%lf\n",(double)(stop - start) / CLOCKS_PER_SEC);
}

上面算法从1开始遍历,来寻找第N个丑数,当N很大时花费的时间会很多。当N为1400的时候消耗23秒,随着N的增大,耗时相当严重



寻找丑数算法2:

想办法从上一个丑数推断出下一个丑数,而不需要从1开始遍历再判断。从1开始的10个丑数分别为1,2,3,4,5,6,8,9,10,12。可以发现除了1以外,丑数都是由某个丑数*2或者*3或者*5得到的。如2是丑数1*2得到的,3是丑数1*3得到的,4是丑数1*4得到的,5是丑数1*5得到的,6是丑数2*3得到的……

具体算法步骤:

(1)从第一个丑数1开始,求出1*2=2 ,1*3=3 ,1*5 = 5;

(2)取上面乘积中大于1的最小值2,作为第二个丑数(丑数是个递增序列,所以第i+1个丑数一定比第i个丑数)

(3)求丑数2之前的丑数与2、3、5的乘积:1*2=2 ,1*3=3 ,1*5 = 5; 2*2 = 4; 2*3 = 6; 2*5 =10;

(4)取上面乘积中大于2的最小值3,作为第三个丑数

……

……

(i)取出丑数i之前的丑数分别与2、3、5的乘积

(i+1)取乘积中大于i的最小值作为丑数

(i+2)重复(i)(i+1)的步骤直到计数器等于N

#include <stdio.h>
#include <time.h>
#include <string.h>#define MaxLen 99999//用于求出3个数的最小值
int compare(int chenTwo,int chenThree,int chenFive){if(chenTwo <=chenThree){if(chenTwo <= chenFive)return chenTwo;elsereturn chenFive;}else if(chenThree <= chenFive)return chenThree;elsereturn chenFive;
}//找出第N个丑数
int findUgly(int N){int ugly[MaxLen]={1}; //用于保存丑数的数组,将丑数1存入数组中int count=1; //数组中仅有丑数1,所以计数器为1while(1){int chenTwo = 0;int chenThree = 0;int chenFive = 0;/*ugly数组中最新的一个丑数为ugly[count-1],ugly[count-1]之前的丑数与2相乘,求出第一个乘积大于ugly[count-1]的值保存在chenTwo中*/for(int i = 0 ; i < count ; i++){ if(ugly[i]*2 >ugly[count-1]){chenTwo = ugly[i]*2;break;}}/*ugly数组中最新的一个丑数为ugly[count-1],ugly[count-1]之前的丑数与3相乘,求出第一个乘积大于ugly[count-1]的值保存在chenThree中*/for(i = 0 ; i < count ; i++){if(ugly[i]*3 >ugly[count-1]){chenThree = ugly[i]*3;break;}}/*ugly数组中最新的一个丑数为ugly[count-1],ugly[count-1]之前的丑数与5相乘,求出第一个乘积大于ugly[count-1]的值保存在chenFive中*/for(i = 0 ; i < count ; i++){if(ugly[i]*5 >ugly[count-1]){chenFive = ugly[i]*5;break;}}//chenTwo,chenThree,chenFive的最小值为新的丑数,存入ugly数组中ugly[count]=compare( chenTwo, chenThree, chenFive);count++;if(count==N) //第N个丑数return ugly[count-1];}
}void main(){int N=0;scanf("%d",&N);clock_t start = clock();printf("%d\n",findUgly(N));clock_t stop = clock();printf("耗时:%lf\n",(double)(stop - start) / CLOCKS_PER_SEC);
}

当输入N=1400时,耗时还不足0.1秒。可见算法2的速度是算法1所不能比拟的,这是用空间来换取效率的结果。

转载于:https://www.cnblogs.com/xiaogua918/p/4181577.html

算法分析---寻找丑数相关推荐

  1. 牛客网 2018校招真题 滴滴出行 寻找丑数

    Description 牛客网 2018校招真题 寻找丑数 Solving Ideas 参考<剑指offer>丑数 Time complexity : O(n)O(n)O(n) Space ...

  2. 每日一道算法题-寻找丑数

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 题目:我们把只包含因子2.3和5的数称 ...

  3. 算法题3 寻找丑数数值逼近

    题目 只包含因子2.3.5的数字被称为丑数.例如4和6是丑数,而14不是丑数,因为含有因子7.习惯上把1作为第一个丑数.求按从小到大顺序的第1500个丑数. 分析 假设一个丑数顺序数组ugly_num ...

  4. 程序员面试题精选100题(37)-寻找丑数[算法]

    题目:我们把只包含因子 2. 3和 5的数称作丑数(Ugly Number).例如 6. 8都是丑数,但 14不是,因为它包含因子 7.习惯上我们把 1当做是第一个丑数.求按从小到大的顺序的第 150 ...

  5. (19) 转载: 寻找丑数

    题目:我们把只包含因子 2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑数. 分析 ...

  6. 输入一个数寻找丑数C语言,数据结构与算法试题80道.doc

    数据结构与算法试题80道 由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到, ...

  7. 洛谷P1246C语言,codevs1246 丑数

    题目描述 Description 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2 ...

  8. Python | 动态规划解决“返回第n个丑数”

    本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 ...

  9. 剑指Offer49—丑数

    剑指Offer49-丑数 题意 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 丑数即只能被 2.3.5 整除.判断一个数是不是丑数的 ...

最新文章

  1. Linux设备文件简介。
  2. 一个不错的JS折叠效果
  3. 将Spring集成到旧版应用程序中
  4. android 带图片的文本框
  5. CM3计算板I/O编程
  6. 谈一谈Java编程开发中虚拟机的内存区域划分?猿们怎么看?
  7. 在easyui中如何使用ajax请求数据,Ajax 中正常使用jquery-easyui (转)
  8. redis db0 到 db15_深入剖析Redis系列: Redis集群模式搭建与原理详解
  9. log4j.properties配置详解(转载)
  10. linux驱动编写(usb host驱动入门)
  11. 关于在openstack执行nova get-vnc-console命令,无法得到vnc url并提示服务器超时的问题描述...
  12. bootice工具修复linux,如何使用bootice工具修复引导
  13. python抢商品_python爬虫,抢小米抢购,
  14. 番茄时间--C#实现
  15. 分享软件测试计划模板
  16. RTKLIB MANUAL 之 Instructions 第一部分
  17. C# 类库组件在工具箱不显示问题
  18. Unix与Linux、Minx、Minix
  19. Java-opts变量没生效,使用JAVA_OPTS env变量运行java无效
  20. 判断当前是在ie还是谷歌

热门文章

  1. 使用Docker国内镜像源
  2. 耳朵上的艺术品,飞利浦圈铁真无线耳机JT60无敌了!
  3. YTU 2798: 复仇者联盟之数组成绩统计
  4. 微信小程序答题,怎么设计页面渲染,答完一题,跳到下一题
  5. python基础练习题(一)
  6. 2018年中国互联网企业100强
  7. 写论文第二步——管理文献 上(文献管理软件)
  8. tga是什么格式?tga格式用什么软件打开?tga格式怎么转换成jpg
  9. 商城、门户、微信服务平台、CMS、易企秀、红包、分销商城、游戏源代码
  10. 音视频、即时通讯、IM对传统聊天的影响