欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

《剑指offer》第四十九题(丑数)

发布时间:2025/6/17 编程问答 50 豆豆
生活随笔 收集整理的这篇文章主要介绍了 《剑指offer》第四十九题(丑数) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
// 面试题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》第四十九题(丑数)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。