46. 谷歌面试题:寻找丑数

题目:我们把仅仅包括因子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;
}

原文地址:https://www.cnblogs.com/xfgnongmin/p/10690193.html

时间: 2024-10-08 05:01:16

46. 谷歌面试题:寻找丑数的相关文章

笔试算法题(20):寻找丑数 &amp; 打印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

华为机试—寻找丑数 &amp;&amp; 九度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