题目:我们把仅仅包括因子2、3和5的数称作丑数(Ugly
Number)。比如6、8都是丑数,但14不是,由于它包括因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。
分析:这是一道在网络上广为流传的面试题,据说google以前採用过这道题。
这段题刚開始的想法是从1開始递增遍历,找出1500个是丑数的数,并打印出来。
实现例如以下:
#include<stdio.h> #include<string.h> #include<iostream> #include<stdlib.h> using namespace std; bool isUgly(int d) { while(d%2 == 0) d/=2; while(d%3 == 0) d/=3; while(d%5 == 0) d/=5; if(d == 1) return true; return false; } void printUglyN(int num) { int k = 0; for(int i= 1; k < num; i ++) { if(isUgly(i)) { k++; cout << i << "\t"; } } } int main() { printUglyN(1500); return 0; }
上面计算次数非常多,能够採用一种简单的方法,思想非常精妙。
后面的数是前面数的基础上*2或3或5得到的。
能够用三个指针指向乘以2,乘以3,乘以5后位置。
请看算法实现:
#include<stdio.h> #include<string.h> #include<iostream> #include<stdlib.h> //#define min(a, b, c) ((((a)>(b))? (b):(a)) > (c)) ? c : (((a)>(b))?(b):(a)) using namespace std; int min(int a, int b, int c) { int t = a > b ? b : a; return t> c ? c:t; } void findUglyN(int *uglys, int num) { uglys[0] = 1; int p2 = 0; int p3 = 0; int p5 = 0; int i = 1; while( i < num) { uglys[i] = min(uglys[p2]*2, uglys[p3]*3, uglys[p5]*5); if(uglys[i] == uglys[p2]*2) p2++; if(uglys[i] == uglys[p3]*3) p3++; if(uglys[i] == uglys[p5]*5) p5++; i++; } } int main() { int num = 1500; int *uglys = new int[num]; findUglyN(uglys, num); for(int i = 0; i < num; i++) cout << uglys[i] << "\t"; delete[] uglys; return 0; }
46. 谷歌面试题:寻找丑数
原文地址:https://www.cnblogs.com/xfgnongmin/p/10690193.html
时间: 2024-10-08 05:01:16
46. 谷歌面试题:寻找丑数的相关文章
笔试算法题(20):寻找丑数 &; 打印1到N位的所有的数
出题:将只包含2,3,5的因子的数称为丑数(Ugly Number),要求找到前面1500个丑数: 分析: 解法1:依次判断从1开始的每一个整数,2,3,5是因子则整数必须可以被他们其中的一个整除,如果不包含任何其他因子则最终的结果为1: 解法2:小丑数必然是某个大丑数的因子,也就是乘以2,3,或者5之后的值,所以可以利用已经找到的丑数来寻找下一个丑数,使用数组有序保存已经找到的丑 数,并且当前最大丑数值为M:用大于M/2的丑数乘以2得到M1,用大于M/3的丑数乘以3得到M2,用大于M/5的丑数
37.寻找丑数
http://zhedahht.blog.163.com/blog/static/2541117420094245366965/ http://www.cppblog.com/zenliang/articles/131094.html http://www.cnblogs.com/coser/archive/2011/03/07/1976525.html 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是
算法分析---寻找丑数
什么是丑数: 一个数的因子仅仅包括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个丑数. 如
剑指offer之寻找丑数,待字闺中之序列生成分析
题目来源:剑指offer之寻找丑数 与 待字闺中之序列生成分析 两个题目其实是同一个问题,所有放在一起,算是总结一下,题目如下: 给定一个表达式2^i*2^j,其中i,j为非负整数.请找到一种方法,生成如下序列: 2^0 * 5^0 = 1 2^1 * 5^0 = 2 2^2 * 5^0 = 4 2^0 * 5^1 = 5 2^3 * 5^0 = 8 2^1 * 5^1 = 10 2^4 * 5^0 = 16 2^2 * 5^1 = 20 2^0 * 5^2 = 25 ... ... ... 阅
【转】HDU 1058 Humble Numbers:寻找丑数问题?DP?
这个和上一道HDU 3199 Hamming Problem是类似的,有了思路就开始码代码了,可是!序数词的写法不对(代码注释部分)又上网普及了序数词的写法··· 搜到其他解题报告 其中有把这道题分类为DP的,最优子结构?无后效性? 还有“寻找丑数问题” 详情点这里. #include<iostream> #include<cstdio> using namespace std; const int Size=5842; long long num[Size+1]; int mai
【剑指offer】面试题 49. 丑数
面试题 49. 丑数 题目描述 题目:把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解答过程 样例 给出 num = 8,返回 true. 给出 num = 14,返回 false. 代码实现 1.判断一个数是否是丑数 public class Solution { /** * @param num: An integer * @return: true if n
华为机试—寻找丑数 &;&; 九度OJ 1214
题目1214:丑数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1733 解决:771 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据, 输出第N个丑数. 样例输入: 3 样例输出: 3 #include<iostream> #in
华为机试—寻找丑数(由浅入深优化至20ms)
题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据, 输出第N个丑数. 样例输入: 3 样例输出: 3 所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0.根据丑数的定义,丑数只能被2.3和5整除.也就是说如果一个数如果它能被2整除,我
HDU 1058 Humble Numbers (动规+寻找丑数问题)
Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16742 Accepted Submission(s): 7280 Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble numb