Вопрос Как оптимизировать этот код

Регистрация
22 Июн 2013
Сообщения
79
Репутация
0
Спасибо
0
Монет
0
#include

#include

#include



std::vector prime_numbers;



void set_prime_numbers() {

prime_numbers.reserve(110)

prime_numbers.push_back(2);

prime_numbers.push_back(3);

for (int i = 1; i < 102; i++) {

prime_numbers.push_back(6 * i - 1);

prime_numbers.push_back(6 * i + 1);

}

}



long long fact(int n) {

long long result = 1;

for (int i = n; i > 0; i--) {

result = result * i;

}

return result;

}



std::string decomp(long long n) {

set_prime_numbers();

n = fact(n);

std::string result;

int d = 1;

for (int elem = 0;;) {

if (n == 1){

result += std::to_string(prime_numbers[elem]);

break;

}



if (n % prime_numbers[elem] == 0) {

n = n / prime_numbers[elem];

d++;

}

if (n % prime_numbers[elem] != 0) {

result += std::to_string(prime_numbers[elem]) + ((d==1)?"":"^" + std::to_string(d)) + " * ";

++elem;

n = n / prime_numbers[elem];

d = 1;

}

}

return result;

}
 
ну факториал можно упростить в синтаксисе до
result *= i;

или до макаронины вида
for (int i = n; i &gt; 0; result *= i--);

далее у вас не совсем правильный prime - 25 является простым? (i == 4)
еслиб все было так легко - не былоб так трудно их считать

но вообще праймы то как раз и можно опустить и расчитывать их надо один раз, а не при каждом вызове decomp (ile или ress?). просто создайте где-то функцию-инициализатор массива праймов со 110 макаронинами и вызовите её один раз допустим в main или как-то ещё если не надо всегда но надо при использовании хотябы раз

а да и ещё зачем у вас деления в обоих if в decomp? если нет остатка значит одна ветка ИНАЧЕ другая, не надо дважды одно и тоже проверять
 
Назад
Сверху