其他分享
首页 > 其他分享> > 丑数(UglyNumber)的求解

丑数(UglyNumber)的求解

作者:互联网

1.丑数说明:

  Ugly number is a number that only have factors 23 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