Version 1
/*
丑数
*/
#include <iostream>
using namespace std;
int divide(int n, int m);
int isUgly(int n);
int main()
{
int n = 1;
int account = 0;
int num = 100;
while (1)
{
if (isUgly(n))
{
cout<<n<<endl;
account++;
}
if (account == num)
{
break;
}
n++;
}
system("pause");
return 0;
}
int divide(int n, int m)
{
while (n % m == 0)
{
n = n / m;
}
return n;
}
int isUgly(int n)
{
n = divide(n, 2);
n = divide(n, 3);
n = divide(n, 5);
return (n == 1) ? 1 : 0;
}
Version 2: Dynamic Programming : Bottom Up (Tabulation)
#include <iostream>
using namespace std;
#define bool int
unsigned int min(unsigned int a, unsigned int b);
unsigned int Minimum(unsigned int a, unsigned int b, unsigned int c);
unsigned int getNthUglyNo(unsigned int n);
int main()
{
unsigned int num = 150;
unsigned int no = getNthUglyNo(num);
cout<<"The "<<num<<" Ugly num is: "<<no<<endl;
getchar();
return 0;
}
/* Function to get the nth ugly number*/
unsigned int getNthUglyNo(unsigned int n)
{
unsigned int *ugly = new unsigned int [n];
unsigned int i2 = 0, i3 = 0, i5 = 0;
unsigned int next_multiple_of_2 = 2;
unsigned int next_multiple_of_3 = 3;
unsigned int next_multiple_of_5 = 5;
unsigned int next_ugly_no = 1;
ugly[0] = 1;
for(unsigned int i=1; i<n; i++)
{
next_ugly_no = Minimum(next_multiple_of_2, next_multiple_of_3, next_multiple_of_5);
ugly[i] = next_ugly_no;
if(next_ugly_no == next_multiple_of_2)
{
i2 = i2 + 1;
next_multiple_of_2 = ugly[i2] * 2;
}
if(next_ugly_no == next_multiple_of_3)
{
i3 = i3 + 1;
next_multiple_of_3 = ugly[i3] * 3;
}
if(next_ugly_no == next_multiple_of_5)
{
i5 = i5 + 1;
next_multiple_of_5 = ugly[i5] * 5;
}
}
return next_ugly_no;
}
unsigned int min(unsigned int a, unsigned int b)
{
return a < b ? a : b;
}
unsigned int Minimum(unsigned int a, unsigned int b, unsigned int c)
{
unsigned int mini = min(a, b);
return c < mini ? c : mini;
}