您的位置:首页 > 职场人生

剑指Offer之面试题34:丑数

2017-01-07 21:17 274 查看
所有代码均通过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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 剑指Offer 面试题