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

#include <iostream>// ====================算法1的代码====================
//不用额外的内存,直接计算
bool IsUgly(int number)//判断是不是丑数
{while (number % 2 == 0)number /= 2;while (number % 3 == 0)number /= 3;while (number % 5 == 0)number /= 5;return (number == 1) ? true : false;
}int GetUglyNumber_Solution1(int index)
{if (index <= 0)return 0;int number = 0;int uglyFound = 0;while (uglyFound < index)//从头到尾开始计算
    {++number;if (IsUgly(number))++uglyFound;}return number;
}// ====================算法2的代码====================
//使用内存,只计算丑数,节省时间
int Min(int number1, int number2, int number3);int GetUglyNumber_Solution2(int index)
{if (index <= 0)return 0;int *pUglyNumbers = new int[index];pUglyNumbers[0] = 1;int nextUglyIndex = 1;int *pMultiply2 = pUglyNumbers;//用来存储前面丑数的二倍值中,刚好大于当前最大丑数的数值int *pMultiply3 = pUglyNumbers;//三倍int *pMultiply5 = pUglyNumbers;//五倍while (nextUglyIndex < index){int min = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5);//将这三个值中最小值作为下一个丑数存储pUglyNumbers[nextUglyIndex] = min;while (*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex])//更新这三个值++pMultiply2;while (*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex])++pMultiply3;while (*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex])++pMultiply5;++nextUglyIndex;}int ugly = pUglyNumbers[nextUglyIndex - 1];delete[] pUglyNumbers;return ugly;
}int Min(int number1, int number2, int number3)
{int min = (number1 < number2) ? number1 : number2;min = (min < number3) ? min : number3;return min;
}// ====================测试代码====================
void Test(int index, int expected)
{if (GetUglyNumber_Solution1(index) == expected)printf("solution1 passed\n");elseprintf("solution1 failed\n");if (GetUglyNumber_Solution2(index) == expected)printf("solution2 passed\n");elseprintf("solution2 failed\n");
}int main(int argc, char* argv[])
{Test(1, 1);Test(2, 2);Test(3, 3);Test(4, 4);Test(5, 5);Test(6, 6);Test(7, 8);Test(8, 9);Test(9, 10);Test(10, 12);Test(11, 15);Test(1500, 859963392);Test(0, 0);system("pause");return 0;
}

转载于:https://www.cnblogs.com/CJT-blog/p/10526308.html

《剑指offer》第四十九题(丑数)相关推荐

  1. 牛客网(剑指offer) 第十九题 顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...

  2. 《剑指offter》第十九题(js)

    第十九题 顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  3. 牛客网(剑指offer) 第二十五题 复杂链表的复制

    //题目描述 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点 ...

  4. 《剑指offer》第十五题(二进制中1的个数)

    // 面试题:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inclu ...

  5. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  6. 牛客网(剑指offer) 第二十二题 从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. <?php/*class TreeNode{var $val;var $left = NULL;var $right = NUL ...

  7. 牛客网(剑指offer) 第十八题 二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. <?php/*class TreeNode{var $val;var $left = NULL;var $right = NULL;fun ...

  8. 牛客网(剑指offer) 第十六题 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. <?php /*class ListNode{var $val;var $next = N ...

  9. 牛客网(剑指offer) 第十五题 反转链表

    //题目描述:输入一个链表,反转链表后,输出该链表的所有元素. <?php /*class ListNode{var $val;var $next = NULL;function __const ...

  10. 牛客网(剑指offer) 第十二题 数值的整数次方

    //题目描述 //给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. <?phpfunction Power($base, $expo ...

最新文章

  1. [JAVA EE]session 和 token 机制
  2. 模板页显示Excel数据Gridview增删改查
  3. ClassLoader.getSystemResourceAsStream()
  4. 一入职!就遇到MySQL亿级大表优化....
  5. 用tensorflow还原PSENet网络
  6. 第十七次ScrumMeeting会议
  7. ajax读取.txt文件出现乱码
  8. 【Linux系统编程学习】 动态库的制作与使用
  9. 字节跳动算法工程师总结:中高级java开发面试题
  10. Katta:基于Lucene可伸缩分布式实时搜索方案
  11. 基本的 Python socket 模块
  12. 【转载】 禁止国外IP访问你的网站
  13. C#导入.dll Please make sure that the file is accessible and that it is a valid assembly or COM compone
  14. jqprint去除页眉页脚
  15. unity 实现手机振动_Unity3d之音效播放和调用手机震动
  16. 有哪些好用的在线电影影视导航网站
  17. 双非大学改考408,软件工程专业考研报考人数较少!
  18. 省赛题目(4月23日)
  19. PCDATA和CDATA的区别究竟是什么呢?
  20. PHPMyWind教程:增加上传类型

热门文章

  1. C#操作SqlServer数据库的常用对象,及其方法
  2. Android 阻隔返回键
  3. [POJ 2329] Nearest number-2
  4. VMware vSphere学习整理
  5. Java7编程 高级进阶学习笔记--嵌套类
  6. 01 Python基础学习
  7. flask数据库迁移理解及命令
  8. Oracle 哈希连接原理
  9. 约瑟夫问题的循环链表实现
  10. redhat下网络的配置