Dynamic Programming
#include <iostream>
using namespace std;
unsigned int min(unsigned int a, unsigned int b, unsigned int c)
{
if(a <= b)
{
if(a <= c)
{
return a;
}
else
{
return c;
}
}
else
{
if (b <= c)
{
return b;
}
else
{
return c;
}
}
}
unsigned int getNthUglyNo(unsigned int n)
{
unsigned int *ugly = new unsigned int [n];
unsigned int i2 = 0, i3 = 0, i5 = 0;
unsigned int i;
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(i=1; i<n; i++)
{
next_ugly_no = min(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;
}
int main()
{
unsigned int n;
cin>>n;
unsigned int no = getNthUglyNo(n);
printf("%dth ugly no. is %d\n", n, no);
system("pause");
return 0;
}
Time Complexity: O(n)
Storage Complexity:O(n)