可以通过暴力枚举,但每次*2,*3,*5后要做排序。很耗时。
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=1181
如何枚举 x, y, z 使其不重复,且按照从小到大的顺序得出.
假定,我们已经求得了第 Ai 个 Ugly Number
那么, Ai*2,Ai*3,Ai*5 也必定是 Ugly Number, 这也确实是这样.但是我们想要知道的是其顺序大小关系.
第i个Ugly Number 为Ai, i+1个Ugly Number该如何求呢.
它必定是前面已求得的一个数 Aj, 通过 *2, *3, *5 ,增加一个素因子(2,3,5)得到.
如果我们保存上一次分别通过 *2, *3, *5 得到的 Ax, Ay, Az 我们就可以知道 i+1个 Ugly Number..
则当前 Ai+1 = Min{ Ax*2, Ay*3, Az*5 }
此解法有点类似贪心的思路了。
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std;
int ans[1510];
int main()
{
int a1,a2,a3;
int t = 1;
a1 = a2 = a3 = 1;
ans[t] = 1;
while(t<=1500)
{
int fi = min(ans[a1]*2,min(ans[a2]*3,ans[a3]*5));
if(fi == ans[a1]*2)
{
a1++;
}
if(fi == ans[a2]*3)
{
a2++;
}
if(fi == ans[a3]*5)
{
a3++;
}
ans[++t] = fi;
}
printf("The 1500'th ugly number is %d.\n",ans[t-1]);
return 0;
}