返回第n个丑数

来源:互联网 发布:知乎 电脑版 编辑:程序博客网 时间:2024/05/22 05:15
把只包含质因子2、3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数。

写一个高效算法,返回第n个丑数。

解法1: 判断某个数是否为丑数,连续找到第n个丑数

#include <iostream>using namespace std;bool isUgly(int num){if(num < 1)return false;if(num == 1)return true;while(num % 2 == 0)num /= 2;while(num % 3 == 0)num /= 3;while(num % 5 == 0)num /= 5;return num == 1;}int nthUgly(int n){int index = 1, x = 2;while(index < n){if(isUgly(x)){index++;++x;}else++x;}return x - 1;}int main(){int n;cout << "input the number n:\n";cin >> n;cout << nthUgly(n);return 0;}


解法2:在当前丑数里乘以2,3,5,找到最小的后续丑数添加到序列里

#include <iostream>using namespace std;int minOf3(int a, int b, int c){int temp = (a < b ? a : b);return (temp < c ? temp : c);}long findUgly(int n){int *ugly = new int[n];ugly[0] = 1;int index2 = 0, index3 = 0, index5 = 0;int index = 1;while(index < n){int val = minOf3(ugly[index2] * 2, ugly[index3] * 3, ugly[index5] * 5);ugly[index] = val;while(val >= ugly[index2] * 2)++index2;while(val >= ugly[index3] * 3)++index3;while(val >= ugly[index5] * 5)++index5;index++;}cout <<ugly[n - 1];delete [] ugly;return 0;}int main(){int n;cout << "input the number n:\n";cin >> n;findUgly(n);return 0;}


0 0
原创粉丝点击