题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:不难发现丑数都是丑数的2、3、5倍,因此只需要从1开始乘2、3、5来找丑数,需要注意的是找到的丑数是需要有序的,所以可以来维护三个队列,分别是2、3、5的倍数,然后不断将最小的数加入丑数数组。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int uglyNum(int n)
{
int newnum = 1;
vector<int> arr;
int p2=0, p3=0, p5 = 0;
arr.push_back(newnum);
while (arr.size() < n)
{
newnum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5));
if (newnum % 2 == 0) p2++;
if (newnum % 3 == 0) p3++;
if (newnum % 5 == 0) p5++;
arr.push_back(newnum);
}
return newnum;
}
int main()
{
int n;
cin >> n;
int result = uglyNum(n);
cout << result;
}
注意:
(1)使用容器需要包含头文件vector,记住两个常用的操作:v.size()不用忘记括号,和v.push_back
(2)min()函数只能比较两个数的大小,不能min(a,b,c),另外要包含头文件algorithm