/*
我们把只包含因子2、3和5的数称为丑数(Ugly number)。求按从小到大的顺序的第1500个丑数。
例如6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个丑数。
*/
#include "iostream"
using namespace std;
//最直观的方法,写一个丑数判断函数,从1开始count,count到1500输出。
bool isUglyNum(int num)
{
while (num % 2 == 0)
num /= 2;
while (num % 3 == 0)
num /= 3;
while (num % 5 == 0)
num /= 5;
return num == 1 ? true : false;
}
int nthUnlyNum0(int nth)
{
int count = 0;
int i = 0;
while (count < nth)
{
i++;
if (isUglyNum(i))
count++;
}
cout << i << endl;
return i;
}
//空间换时间做法
int Min(int a, int b, int c)
{
int tmp = a > b ? b : a;
return tmp > c ? c : tmp;
}
int nthUnlyNum1(int nth)
{
if (nth <= 0)
return 0;
int *pUglyNums = new int[nth];
pUglyNums[0] = 1;
int nextUglyIndex = 1;
int *pMultiply2 = pUglyNums;
int *pMultiply3 = pUglyNums;
int *pMultiply5 = pUglyNums;
while (nextUglyIndex < nth)
{
int minNum = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5);
pUglyNums[nextUglyIndex] = minNum;
while (*pMultiply2 * 2 <= pUglyNums[nextUglyIndex])
++pMultiply2;
while (*pMultiply3 * 3 <= pUglyNums[nextUglyIndex])
++pMultiply3;
while (*pMultiply5 * 5 <= pUglyNums[nextUglyIndex])
++pMultiply5;
++nextUglyIndex;
}
int result = pUglyNums[nth - 1];
delete[] pUglyNums;
cout << result << endl;
return result;
}
#include "ctime"
void test()
{
clock_t t0 = clock();
nthUnlyNum0(1500);
cout << clock() - t0 << "ms" << endl;
t0 = clock();
nthUnlyNum1(1500);
cout << clock() - t0 << "ms" << endl;
}
int main()
{
test();
return 0;
}
运行结果:
859963392
38783ms
859963392
1ms
这道题也好棒!