此问题已存在Super Ugly Number
写一个程序来找到第n个超级难看的数字。
超级丑陋的数字是正数,其所有素数因子都在大小为k的给定素数列表素数中。例如,[1,2,4,7,8,13,14,16,19,26,28,32]是给出素数= [2,7,13,19]的前12个超丑数的序列大小为4
但是我试图在没有看到解决方案的情况下解决它,但它在某些测试用例上失败了,比如这个
45
[2,3,7,13,17,23,31,41,43,47]
任何人都可以指出错误。
int nthSuperUglyNumber(int n, vector<int>& primes) {
int *ugly = new int[n];
/*first number*/
ugly[0]=1;
int i, s=primes.size();
/*all multiples point to start*/
vector<int> iterators(s, 0);
int next_ugly,j, id, t;
for(i=1;i<n;i++){
next_ugly=INT_MAX;
/*find the minimum*/
id=0;
for(j=0;j<s;j++){
t=ugly[iterators[j]]*primes[j];
/*if current number is less, then it is already added*/
if(t<=ugly[i-1]){
iterators[j]++;
j--; //mistake was here
}
/*check for smallest*/
else if(t<next_ugly){
id=j;
next_ugly=t;
}
}
ugly[i]=next_ugly;
cout<<ugly[i]<<" ";
iterators[id]++;
}
return ugly[n-1];
}
我的输出
2 3 4 6 7 8 9 12 13 14 16 17 18 21 23 24 26 27 28 31 32 34
36 39 41 42 43 46 47 48 49 51 52 54 56 62 63 64 68 69 72 78 82 84
缺少81
输入
45
[2,3,7,13,17,23,31,41,43,47]
编辑:理解并纠正错误。