码迷,mamicode.com
首页 > 其他好文 > 详细

丑数(UglyNumber)的求解

时间:2019-04-12 23:20:34      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:using   记录   include   info   ==   name   技术   clu   div   

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.运行结果如下图所示:

 

           技术图片

 

丑数(UglyNumber)的求解

标签:using   记录   include   info   ==   name   技术   clu   div   

原文地址:https://www.cnblogs.com/gcong/p/10699127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!