丑数(UglyNumber)的求解
作者:互联网
1.丑数说明:
Ugly number is a number that only have factors 2
, 3
and 5
.
我们把只含有因子2、3、5的数称为丑数(规定1为最小的丑数。
例如1、 2、 3、 4、 5、 6、 8、 12等都是丑数, 7、 14、 22等不是丑数;
2.编程求出第n个丑数:
思路如下:
1、使用一个数组来存储丑数,主要步骤如下:
2、建立递推关系式:
3、 最小的丑数为1,对于任意丑数x,2x, 3x,5x也都是丑数,因此每次生成最小的一位丑数然后记录到数组,直到生成第n小的丑数时返回;
4、生成最小丑数 t = min(a[p1]*2, min(a[p2]*3, a[p3]*5))存入数组,并将维护指针增加;
if(temp == a[p1]*2) p1++;
if(temp == a[p2]*3) p2++;
if(temp == a[p3]*5) p3++;
其中p1, p2, p3一直维护这最大,次大,第三大的值,非常巧妙。
3.附上代码(c++实现):
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 class Solution{ 6 public: 7 int nthUglyNumber(int n) { 8 // write your code here 9 int *a = new int[n+1]; 10 int p1, p2, p3, k; 11 p1 = p2 = p3 = k = 1; 12 a[k++] = 1; 13 if(n == 1) 14 return a[n]; 15 while(true){ 16 int temp = min(a[p1]*2,min(a[p2]*3, a[p3]*5)); 17 a[k++] = temp; 18 //其中p1,p2,p3一直在维护着 19 if(temp == a[p1]*2) 20 p1++; 21 if(temp == a[p2]*3) 22 p2++; 23 if(temp == a[p3]*5) 24 p3++; 25 //判断是否为第n小,是则返回, 不是则继续循环判断 26 if(k-1 == n) 27 return a[n]; 28 } 29 } 30 31 }; 32 33 int main() { 34 Solution s; 35 int n; 36 cout <<"输入一个数:"; 37 while (cin >> n) { 38 cout <<"第"<< n <<"个丑数为"<<s.nthUglyNumber(n)<<endl; 39 cout <<"输入一个数:"; 40 } 41 return 0; 42 }
4.运行结果如下图所示:
标签:p2,丑数,p1,temp,p3,++,求解,UglyNumber 来源: https://www.cnblogs.com/gcong/p/10699127.html