Числа, единственными основными факторами которых являются 2, 3 или 5, называются уродливыми числами.
Пример:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15,...
1 можно рассматривать как 2 ^ 0.
Я работаю над поиском n-го уродливого числа. Обратите внимание, что эти числа чрезвычайно редко распределяются по мере того, как n становится большим.
Я написал тривиальную программу, которая вычисляет, является ли заданное число уродливым или нет. При n > 500 - он стал супер медленным. Я попытался использовать memoization - наблюдение: ugly_number * 2, ugly_number * 3, ugly_number * 5 все некрасиво. Даже при этом он медленный. Я попытался использовать некоторые свойства журнала - так как это уменьшит эту проблему от умножения к добавлению, но пока не удастся. Мысль делиться этим со всеми вами. Любые интересные идеи?
Использование концепции, аналогичной "Сито Эратосфена" (спасибо Анону)
for (int i(2), uglyCount(0); ; i++) {
if (i % 2 == 0)
continue;
if (i % 3 == 0)
continue;
if (i % 5 == 0)
continue;
uglyCount++;
if (uglyCount == n - 1)
break;
}
i - n-е уродливое число.
Даже это довольно медленно. Я пытаюсь найти 1500-е уродливое число.