Скажем, у меня есть номер, я могу найти все основные факторы, которые составляют это число. Например, 6000 составляет 2 ^ 4 * 3 * 5 ^ 3.
Если у меня есть число, которое не факторизуется хорошо (учитывая список приемлемых простых чисел), как я могу найти следующий ближайший номер? Например, учитывая число 5917, каково ближайшее число, которое множится со списком простых чисел 2, 3, 5, 7? Это 6000 в этом примере.
У меня есть что-то, что грубая сила найдет ответ, но должно быть более элегантное решение.
const UInt32 num = 5917;
const CVector<UInt32> primes = { 2, 3, 5, 7 };
const size_t size = primes.size();
UInt32 x = num;
while (x < num * 2)
{
const UInt32 y = x;
for(size_t i = 0; i < size && x > 1; ++i)
{
while(x % primes[i] == 0)
{
x /= primes[i];
}
}
if (x == 1)
{
cout << "Found " << y << endl;
break;
}
else
{
x = y + 1;
}
}
ИЗМЕНИТЬ
Я создал тест, который использовал метод грубой силы и 3 метода, предоставленные в качестве ответов, и получил несколько неожиданные результаты. Все 4 версии дают правильные ответы (так спасибо за ваши вклады), однако метод грубой силы, казалось, был самым быстрым на порядок. Я пробовал несколько разных систем, компиляторов и архитектур, которые дали в основном согласованные результаты.
Тестовый код можно найти здесь: http://ideone.com/HAgDsF. Пожалуйста, не стесняйтесь делать предложения.