您的位置:首页 > 其它

<LeetCode> 题4:丑数

2016-07-12 09:47 453 查看

题目描述:

设计一个算法,找出只含素因子2,3,5 的第 n 大的数。

符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…

注意:1也是丑数

例如:输入9,则输出10

思路一:暴力解法

从1开始依次向后判断各自然数是否为丑数,一直判断到第n个丑数,返回第n个丑数的值。

第一步:先判断每一个数m是否为丑数:可以试着用2、3、5不断整除m,当m不能再被2、3、5整除时,判断m是否等于1,等于1则指定的数字是丑数(返回真),否则不是(返回假)。

判断是否为丑数的方法:对一个数重复除以2,3,5直到这个数不存在2,3,5这三个因子为止,若此时得到的结果不为1,则说明该数不是丑数。

写法一:

bool isUgly(int num)
{
if (num<= 0) return false;
if (num == 1) return true;

while (num>= 2 &&num % 2 == 0) num /= 2;
while (num>= 3 &&num % 3 == 0) num /= 3;
while (num>= 5 &&num % 5 == 0) num /= 5;

return num == 1;
}


写法二:

bool isUgly(int num)
{
if(num< 1) return false;
if(num == 1) return true;

vector<int> num_vect;
num_vect.push_back(2);
num_vect.push_back(3);
num_vect.push_back(5);

for(size_t i=0; i!=num_vect.size();++i)
{
while(num % num_vect[i] == 0)
{
num = num/num_vect[i];
}
}
if(num == 1)
return true;
else
return false;
}


第二步:从1开始,一直判断到第n个丑数为止,返回第n个丑数的值即可。

int nthUglyNumber(int n)
{
if(n<= 1)
return 1;
int count = 0;
for(int i = 1;  ; i++)
{
if(isUgly(i))
{
count++;
if(count == n)
return i;
}
}
}


完整程序:

#include<iostream>
#include<vector>
using namespace std;

bool isUgly(int num)
{
if(num< 1) return false;
if(num == 1) return true;

vector<int> num_vect;
num_vect.push_back(2);
num_vect.push_back(3);
num_vect.push_back(5);

for(size_t i=0; i!=num_vect.size();++i)
{
while(num % num_vect[i] == 0)
{
num = num/num_vect[i];
}
}
if(num == 1)
returntrue;
else
returnfalse;
}

class Solution
{
public:
int nthUglyNumber(int n)
{
if(n<= 1)
return 1;
int count = 0;
for(int i = 1;  ; i++)
{
if(isUgly(i))
{
count++;
if(count == n)
return i;
}
}
}
};

int main()
{
Solution st;
cout<<"第9个丑数为:"<<st.nthUglyNumber(9) <<endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode