你这个属于暴力穷举,基本上不到100就要以秒计了,肯定超时
以前写过一个,主动产生丑数的算法,第1000个也就是1毫秒以内
算法的主要精神就是:后面的丑数是由前面的丑数*2,*3或者*5得来的,然后主动生成丑数序列,关于丑数算法具体细节原理,网上有很多文章,你可以自己搜索
#include
#include
using namespace std;
int min(int a, int b, int c)
{
int t = a < b ? a : b;
return t}
int uglnum(int n)
{
int* unum = new int[n];
int un,i, i2, i3, i5;
unum[0] = 1;
i2 = i3 = i5 = 0;
for (i = 1; i < n; ++i)
{
un = min(unum[i2] * 2, unum[i3] * 3, unum[i5] * 5);
i2 += (un == unum[i2] * 2);
i3 += (un == unum[i3] * 3);
i5 += (un == unum[i5] * 5);
unum[i] = un;
}
un = unum[n - 1];
delete[] unum;
return un;
}
int main()
{
int t,n;
time_t ts;
cin >> t;
for (int i = 0; i < t; ++i)
{
cin >> n;
//ts = clock();
cout << uglnum(n) << endl;
//ts = clock() - ts;
//cout << ts<<"ms"<}
return 0;
}