每日一题(43) - 丑数

题目来自剑指Offer

题目:

每日一题(43) - 丑数_第1张图片

题目换句话说:丑数就是连续除以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;
}

你可能感兴趣的:(每日一题(43) - 丑数)