参考264和263
思路
- 指针法
p[i]
中是primes[i]
每个质数应该相乘的位置,开始时都为1; res = (0<=i<primesSize) min { primes[i]*dp[p[i] }
- 如果
res
是需求的值,那么相应的dp[i]++
- 注意可能出现的重复现象
#include<stdio.h>
#include<string.h>
#define min(a,b) ((a)<(b)?a:b)
int min_all(int *p,int primesSize,int * primes,int *dp,int *res){
int test= dp[p[0]]*primes[0];
*res =test;
int i,j;
for(i=0;i<primesSize;i++){
*res = min(*res,dp[p[i]]*primes[i]);
if(*res == dp[p[i]]*primes[i])
j = i;
}
return j;
}
int nthSuperUglyNumber(int n, int* primes, int primesSize){
int dp[n+1];
memset(dp,0,sizeof(dp));
dp[1] =1;
int i;
int p[primesSize];
for(i=0;i<primesSize;i++)
p[i] = 1;
int next=0,res = 0;
for(i=2;i<=n;){
next = min_all(p,primesSize,primes,dp,&res);
if(dp[i-1]!=res){//破除重复
dp[i] = res;
i++;
}
p[next]++;
}
for(i=0;i<=n;i++)
printf("%d ",dp[i]);
printf("\n");
return dp[n];
}
int main(){
int primes[] = {2,7,13,19};
int res = nthSuperUglyNumber(12,primes,4);
printf("res = %d\n",res);
}