寻找丑数

1,题意: 
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 
习惯上我们把1当做是第一个丑数。 
返回第n个丑数. 

2,分析: //类似于筛法寻找素数 
创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的。 
我们假设数组中已经有若干个丑数,排好序后存在数组中。现在我们来生成下一个丑数,该丑数肯定是前面某一个丑数乘以2、3或者5的结果。 

从1开始,每个数分别乘以一次2,3,5,会贡献3个丑数. 
贡献后,对应的index2或index3或index5就右移一位. 

3,实现代码: 
C++代码   收藏代码
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int mymin(int a, int b, int c)  
  5. {  
  6.     int temp = (a < b ? a : b);  
  7.     return (temp < c ? temp : c);  
  8. }  
  9. int FindUgly(int n) //返回第n个丑数  
  10. {  
  11.     int* ugly = new int[n];  
  12.     ugly[0] = 1;  
  13.     int index2 = 0;  
  14.     int index3 = 0;  
  15.     int index5 = 0;  
  16.     int index = 1;  
  17.     while (index < n)  
  18.     {  
  19.         int val = mymin(ugly[index2]*2, ugly[index3]*3, ugly[index5]*5);  
  20.         if (val == ugly[index2]*2) //看哪个被选中  
  21.             ++index2;  
  22.         if (val == ugly[index3]*3)  
  23.             ++index3;  
  24.         if (val == ugly[index5]*5)  
  25.             ++index5;  
  26.         ugly[index++] = val;  
  27.     }  
  28.     for (int i = 0; i < n; ++i)  
  29.         cout << ugly[i] << endl;  
  30.     int result = ugly[n-1];  
  31.     delete[] ugly;  
  32.     return result;  
  33. }  
  34.   
  35. int main()  
  36. {  
  37.     FindUgly(100);  
  38.     return 0;  
  39. }  

你可能感兴趣的:(寻找丑数)