所有代码均通过G++编译器测试,仅为练手纪录。
//面试题34:丑数
//题目:我们把只包含因子2,3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。
// 例如6,8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当作第一个丑数。
//面试题34:丑数
//题目:我们把只包含因子2,3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。
// 例如6,8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当作第一个丑数。
bool IsUglyNum(int nNum)
{
while ( 0 == nNum%2 )
{
nNum /= 2;
}
while ( 0 == nNum%3)
{
nNum /= 3;
}
while ( 0 == nNum%5)
{
nNum /= 5;
}
return (1 == nNum);
}
int GetUglyNum(int index)
{
if(index <= 0)
{
return 0;
}
int nNum = 0;
int nCount = 0;
while(nCount < index)
{
++nNum;
if (IsUglyNum(nNum))
{
++nCount;
}
}
return nNum;
}
int GetMin(int num1,int num2,int num3)
{
int nMin = (num1 < num2) ? num1 : num2;
return ((nMin < num3) ? nMin : num3);
}
int GetUglyNum2(int index)
{
if (index <= 0)
{
return 0;
}
vector<int> vecNum(index);
vecNum[0] = 1;
int nNextUglyNum = 1;
vector<int>::iterator vecIter2 = vecNum.begin();
vector<int>::iterator vecIter3 = vecNum.begin();
vector<int>::iterator vecIter5 = vecNum.begin();
while (nNextUglyNum < index)
{
int nMin = GetMin(*vecIter2*2, *vecIter3*3, *vecIter5*5);
vecNum[nNextUglyNum] = nMin;
while (*vecIter2*2 <= vecNum[nNextUglyNum])
{
++vecIter2;
}
while (*vecIter3*3 <= vecNum[nNextUglyNum])
{
++vecIter3;
}
while (*vecIter5*5 <= vecNum[nNextUglyNum])
{
++vecIter5;
}
++nNextUglyNum;
}
return vecNum[nNextUglyNum-1];
}
void TestGetUglyNum()
{
int index = 1500;
LogInfo("GetUglyNum : %d",GetUglyNum(index));
LogInfo("GetUglyNum2: %d",GetUglyNum2(index));
}
ZhaiPillary
2017-01-07