题目:我们把只包含因子2、3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。
思路:创建一个排好序的丑数数组,第一个数为1,对应2、3和5分别存在一个丑数乘以2、3和5刚好大于已排序的最大值,即最后一个值,每次更新对应的丑数,依次往后推算,计算1499次。
#include <iostream>
using namespace std;
int Min(int num2, int num3, int num5) {
int min = (num2 < num3) ? num2 : num3;
min = (min < num5) ? min : num5;
return min;
}
int NthUglyNum(const int n) {
int arr[n];
int index2 = 0;
int index3 = 0;
int index5 = 0;
arr[0] = 1;
int nextindex = 1;
while (nextindex < n) {
int min = Min(arr[index2] * 2, arr[index3] * 3, arr[index5] * 5);
arr[nextindex] = min;
while (arr[index2] * 2 <= arr[nextindex])
++index2;
while (arr[index3] * 3 <= arr[nextindex])
++index3;
while (arr[index5] * 5 <= arr[nextindex])
++index5;
++nextindex;
}
return arr[n - 1];
}
int main() {
int n;
cin >> n;
int ugly = NthUglyNum(n);
cout << ugly << endl;
return 0;
}