C/C++

Задача по информатике, C++

Рассматривается множество целых чисел, принадлежащих числовому отрезку [2121; 13469], которые делятся на 3 и 15 и не делятся на 6, 12 и при этом третья справа цифра кратна 3. Найдите максимальное и минимальное из таких чисел. В ответе запишите сумму максимального и минимального чисел.
 #include  
#include
#include
using namespace std;
int third_from_right(int x) {
return x / 100 % 10;
}
bool equals(const int a, const int b) {
return a == b;
}
bool aliquot(const int x, const int a, const int b) {
return 0 == x % a && 0 == x % b;
}
int main() {
const auto dig = 3;
const auto x1 = 3;
const auto x2 = 15;
const auto y1 = 6;
const auto y2 = 12;
const auto a = 2121;
const auto b = 13469;
auto min = numeric_limits::max();
auto max = numeric_limits::min();
auto count = 0;
for (auto x = a; x x) min = x;
if (max < x) max = x;
++count;
}
}
}
if (count != 0) cout
А-
Александр ------------
60 435
Лучший ответ
#include <iostream>
int main() { int i, min, max;
for (i = 2121; i < 13470; i++)
if (i%15 == 0 && i%6 && i/100%10%3 == 0)
{ min = i; break; } for (i = 13469; i > min; i--)
if (i%15 == 0 && i%6 && i/100%10%3 == 0)
{ max = i; break; } std::cout << min + max; }

По-моему, тут самый лучший алгоритм такой: в восходящем цикле ищется самое маленькое подходящее число, а по его нахождении цикл тут же прекращается. Потом в нисходящем цикле ищется наибольшее подходящее число и при его нахождении цикл тоже тут же брейкуется. После чего складываем найденные min=2325 и max=13395 и выводим число 15720 - это правильный ответ (он правильный и у меня, и у Сергея Степанова, а вот во втором по счёту ответе на этот вопрос (это там, где какая-то странная "программа", которая зачем-то сделана с тремя модулями, четырьмя функциями и аж с целыми девятью auto) почему-то получается число 15705, что неверно !). Поиск же подходящих чисел производим по такой методологии: если число делится на 15 незачем тогда проверять его на делимость на 3, а если число не делится на 6, то и незачем тогда проверять его на неделимость на 12.
#include <iostream>

#include <numeric>

constexpr int a = 2121, b = 13469;


int main()

{

constexpr int _lcm_ = std::lcm(3, 15);

int max_n{}, min_n{ 100000 };

int begin = a % _lcm_ ? (a + _lcm_ - a % _lcm_) : a;

for (; begin <= b; begin += _lcm_)

{

if (begin % 6 == 0 or ((begin / 100) % 10)%3 != 0) continue;

max_n = std::max(max_n, begin);

min_n = std::min(min_n, begin);

}

std::cout << max_n + min_n;

}
Павел Гольдварг какой ответ получился?