Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
for (ix0 = 1; ix0 < N; ++ix0)
{
for (ix1 = 1; ix1 < ix0; ++ix1)
{
for (ix2 = 1; ix2 < ix1; ++ix2)
{
baseSum = powers[ix2] + powers[ix1] + powers[ix0];
while (lastRangeIndex > 0 && powers[lastRangeIndex] > baseSum)
{
--lastRangeIndex;
};
for (ix3 = 1; ix3 < ix2; ++ix3)
{
fVal = (ix3 + ix2 + ix1 + ix0 - lastRangeIndex) % 30;
if ( fVal )
{
ix3 += 30 - fVal;
}
if (ix3 >= ix2)
{
break;
}
sum = baseSum + powers[ix3];
while (lastRangeIndex < (N - 1) && powers[lastRangeIndex] < sum)
{
++lastRangeIndex;
};
if (lastRangeIndex == (N - 1))
{
break;
}
foundVal = sum == powers[lastRangeIndex] ? lastRangeIndex : 0;
if (foundVal > 0)
{
// clear line
clearLine();
for (auto ind : foundItems)
{
if ((foundVal % ind) == 0)
{
// duplicate
//foundVal = 0;
break;
}
}
if (foundVal != 0)
{
std::cout << "found: ";
std::cout << ix0 << "^5 ";
std::cout << ix1 << "^5 ";
std::cout << ix2 << "^5 ";
std::cout << ix3 << "^5 ";
speedTime = duration_cast_ms(_start);
// it/ms: iterations per millisecond, it: total iterations, spd:
std::cout << "it/ms: " << (counter / (uint64)speedTime.count()) << " it: " << counter << "\n";
}
else
{
std::cout << "duplicate";
}
}
else
{
if (( 30 + ix3) >= ix2)
{
break;
}
}
counter++;
}
}
}
}
Судя по предложениям, дальше ускорить можно только с помощью математики.
Есть где-нибудь список идей для уменьшения перебора и результат их применения (даже если неудачен)?
Например, если нам не нужны кратные, то
К вопросу о «потерянном времени»