Итак, проблема в следующем:
Напишите программу для нахождения n-го суперуродливого числа.
Сверхуродливые числа — это положительные числа, все простые делители которых входят в заданный список простых чисел размера k. Например, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] — это последовательность первых 12 суперуродливых чисел с заданными простыми числами = [2, 7, 13, 19]. размера 4.
Таким образом, мой алгоритм в основном находит все возможные факторы, используя шаблон, которому они следуют, помещает их в массив, сортирует этот массив и затем возвращает n-е значение в массиве. Он точно вычисляет их все, однако слишком медленно работает с большими значениями n.
Мой вопрос в том, как правильно это сделать, поскольку я уверен, что должно быть более простое решение. Меня больше всего интересует теория, стоящая за его поиском, и есть ли для этого какая-то закрытая формула.
var nthSuperUglyNumber = function(n, primes) {
xprimes = primes;
var uglies = [1];
uglies = getUglyNumbers(n, primes, uglies);
// return uglies[n-1];
return uglies[n - 1];
};
// 3 4
//1, 2,3,5, || 4,6,10, 9,15, 25, || 8,12,20,18,30,50, 27,45,75, 125 ||
// 3,2,1 6,3,1, 10,4,1
// 1 1 1
//1, 2,3 || 4,6, 9, || 8,12,18, 27 || 16,24,36,54, 81
// 2,1 3,1 4,1 5,1
//
//1, 2,3,5,7 || 4,6,10,14 9,15,21 25,35, 49 ||
// 4,3,2,1 || 10,6,3,1
var getUglyNumbers = function(n, primes, uglies) {
if (n == 1) {
return uglies;
}
var incrFactor = [];
var j = 0;
// Initial factor and uglies setup
for (; j < primes.length; j += 1) {
incrFactor[j] = primes.length - j;
uglies.push(primes[j]);
}
//recrusive algo
uglies = calcUglies(n, uglies, incrFactor);
uglies.sort(function(a, b) {
return a - b;
});
return uglies;
};
var calcUglies = function(n, uglies, incrFactor) {
if (uglies.length >= 5 * n) return uglies;
var currlength = uglies.length;
var j = 0;
for (j = 0; j < xprimes.length; j += 1) {
var i = 0;
var start = currlength - incrFactor[j];
for (i = start; i < currlength; i += 1) {
uglies.push(xprimes[j] * uglies[i]);
}
}
// Upgrades the factors to level 2
for (j = 1; j < xprimes.length; j += 1) {
incrFactor[xprimes.length - 1 - j] = incrFactor[xprimes.length - j] + incrFactor[xprimes.length - 1 - j];
}
return calcUglies(n, uglies, incrFactor);
};
k
и насколько высоки высокие n-е значения? - person bolov   schedule 08.12.2015