题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
#include <iostream>
using namespace std;
int Min(int num1, int num2, int num3)
{
int min = (num1 < num2) ? num1 : num2;
min = (min < num3) ? min : num3;
return min;
}
int UglyNumber(int n)
{
if(n <= 0)
return 0;
int *UglyNumber = new int[n];
UglyNumber[0] =1;
int nextUgly = 1;
int *UglyNumber2 = UglyNumber;
int *UglyNumber3 = UglyNumber;
int *UglyNumber5 = UglyNumber;
while(nextUgly < n)
{
int min = Min(*UglyNumber2 * 2,*UglyNumber3 * 3,*UglyNumber5 * 5 );
UglyNumber[nextUgly] = min;
while (*UglyNumber2 * 2 <= UglyNumber[nextUgly])
UglyNumber2++;
while (*UglyNumber3 * 3 <= UglyNumber[nextUgly])
UglyNumber3++;
while (*UglyNumber5 * 5 <= UglyNumber[nextUgly])
UglyNumber5++;
nextUgly++;
}
int ugly = UglyNumber[nextUgly -1];
delete [] UglyNumber;
return ugly;
}
// ====================测试代码====================
void Test(int index, int expected)
{
if(UglyNumber(index) == expected)
printf("solution2 passed\n");
else
printf("solution2 failed\n");
}
int main(int argc, char* argv[])
{
Test(1, 1);
Test(2, 2);
Test(3, 3);
Test(4, 4);
Test(5, 5);
Test(6, 6);
Test(7, 8);
Test(8, 9);
Test(9, 10);
Test(10, 12);
Test(11, 15);
Test(1500, 859963392);
Test(0, 0);
return 0;
}