std::string decomp(long long n) {
if (prime_numbers.empty()) set_prime_numbers(); // запускает формирование прайм_нум если он пуст
n = fact(n);
std::string result;
int d = 0; //у нас все таки может быть нулевая степень ну чисто в теории))
int prime_num = 0;
do //пока множетель числа не равен 1
{
while (n % prime_numbers[prime_num]==0)
{
n /= prime_numbers[prime_num];
d++;
}
// теперь проверка на неравенство не нужна, сразу формируем множетели
result += std::to_string(prime_numbers[prime_num]) + ((d == 1) ? "" : "^" + std::to_string(d));
//сбрасываем степень
d = 0;
//переходим к следующему числу
++prime_num;
//добавляем * если это не последний множетель
if(n!=1) result += " * ";
} while (n != 1);
return result;
}
Ваша программа не работала должным образом, поэтому нуждалась не в оптимизации а в исправлении.
Ну и по мелочам - можно бы добавить проверку на переполнение LL а то факториалы сильно быстро растут
ах да, вместо LL инт лучше использовать unsigned LL или size_t, вроде отрицательных значений не предполагаем а диапазон будет больше.