У меня есть вопрос о вопросе Project Euler и оптимизации с использованием развертывания цикла.
Описание задачи: 2520 — это наименьшее число, которое можно разделить на каждое из чисел от 1 до 10 без остатка. Какое наименьшее положительное число делится без остатка на все числа от 1 до 20?
Решение:
#include <iostream>
#include <limits.h>
#include <stdio.h>
#include <time.h>
using namespace std;
int main() {
clock_t startTime = clock();
for (int i = 1; i < INT_MAX; i++)
{
bool isDivisible = true;
//CODE BLOCK #1
/*for (int j = 2; j <= 20; j++)
{
if ( i % j != 0)
{
isDivisible = false;
break;
{
}*/
//CODE BLOCK #2
/*if (i % 2 != 0 || i % 3 != 0 ||
i % 4 != 0 || i % 5 != 0 ||
i % 6 != 0 || i % 7 != 0 ||
i % 8 != 0 || i % 9 != 0 ||
i % 10 != 0 || i % 11 != 0 ||
i % 12 != 0 || i % 13 != 0 ||
i % 14 != 0 || i % 15 != 0 ||
i % 16 != 0 || i % 17 != 0 ||
i % 18 != 0 || i % 19 != 0 ||
i % 20 != 0 )
isDivisible = false;*/
if (isDivisible)
{
cout << "smallest: " << i << endl;
cout << "Ran in: " << clock() - startTime << " cycles" << endl;
break;
}
}
return 0;
}
Теперь, комментируя БЛОК КОДА № 1 или БЛОК КОДА № 2, я получаю правильный ответ (232792560). Однако БЛОК КОДА № 2 намного быстрее, чем БЛОК КОДА № 1.
БЛОК КОДА № 1: 3 580 000 циклов (я только что добавил разрыв в БЛОК КОДА № 1, и он работает намного быстрее. Однако все же значительно медленнее, чем составной оператор IF.)
КОДОВЫЙ БЛОК № 2: 970 000 циклов
Кто-нибудь знает, почему может возникнуть такая огромная разница в производительности?