题目来自剑指Offer
题目:
题目换句话说:丑数就是连续除以2,3,5,之后商为1的数.
代码:
bool IsUglyNum(int nNum)
{
//消除因子2
while (nNum % 2 == 0)
{
nNum /= 2;
}
//消除因子3
while (nNum % 3 == 0)
{
nNum /= 3;
}
//消除因子5
while (nNum % 5 == 0)
{
nNum /= 5;
}
if (nNum == 1)
{
return true;
}
else
{
return false;
}
}
题目思路:丑数乘以2,3,5后仍是丑数。
具体来说:根据现有丑数,每次扩展一个丑数。
(1)使用三个指针nCurOne,nCurTwo,nCurThree用来分别产生乘以2,3,5后的候选丑数。
(2)之后取三个候选丑数的最小值,作为本次扩展的丑数。
(3)让产生的候选丑数等于本次扩展丑数的指针都往前走一步。
注意:三个指针总是指向其待扩展的丑数。
代码:
#include <iostream>
using namespace std;
const int SIZE = 10000;
int Min(int x,int y,int z)
{
if (x < y)
{
if (x < z) //y > x,z > x
{
return x;
}
else //y>x,x>=z
{
return z;
}
}
else
{
if (z > y)//x > y
{
return y;
}
else //x>y,y>z
{
return z;
}
}
}
int UglyNum(int nIndex)
{
int nArrUgly[SIZE];
int nCurTwo = 0;
int nCurThree = 0;
int nCurFive = 0;
int nCount = 1;
int nCurUgly = 0x3f3f3f;
nArrUgly[0] = 1;
while (nCount < nIndex)
{
nCurUgly = Min(nArrUgly[nCurTwo] * 2,nArrUgly[nCurThree] * 3,nArrUgly[nCurFive] * 5);
nArrUgly[nCount++] = nCurUgly;
if (nArrUgly[nCurTwo] * 2 == nCurUgly)
{
nCurTwo++;
}
if (nArrUgly[nCurThree] * 3 == nCurUgly)
{
nCurThree++;
}
if (nArrUgly[nCurFive] * 5 == nCurUgly)
{
nCurFive++;
}
}
return nCurUgly;
}
int main()
{
cout<<UglyNum(1500)<<endl;
system("pause");
return 1;
}