Другие языки программирования и технологии

Алгоритм поиска на C++

Не первый раз сталкиваюсь с задачами по типу "есть число, необходимо определить можно ли его разбить на тройки и четверки (пример 10 = 3+3+4)", я так поимаю тут нужен особый алгоритм, где про это почитать ну или что гуглить хоть
Valeh Rehimov
Valeh Rehimov
701
вряд ли про такое пишут книги, но догадаться можно и самому

если достаточно, чтобы в разбиении были только тройки или только четверки
то тут критерий простой - любое число > 5 (а так же сами 3 и 4) можно разбить таким образом:
3 = 3
4 = 4
6 = 3 + 3
7 = 3 + 4
8 = 4 + 4
9 = 3 + 3 + 3 итд

если в разбиении обязательно должны быть и тройки и четверки, то
представим, что наше число разбивается на a троек и b четверок. т. е. имеет вид

4a + 3b = n, где a > 0 и b > 0

после небольшого преобразования получаем

(3+1)a + 3b = n
3a + a + 3b = n
3(a + b) = n - a

получается что (n - a) должно делиться на 3 без остатка
мы не знаем a, но можем его подобрать
благо что если число n делится на 3, то и n - 3 делится, и n - 6 итд

т. е. нужно проверить:
делится ли n - 1 на 3, и при этом результат > 1 (чтобы соблюсти условие a > 0 и b > 0)
делится ли n - 2 на 3, и при этом результат > 2
делится ли n - 3 на 3, и при этом результат > 3
если хотя бы одно условие верно - разбиение возможно

последние шаги можно немного упростить взятием остатка, но это уже можно оставить на домашнее задание :)

также стоит обратить внимание, что любое n > 12 проходит по условию, так что можно ограничиться проверкой первых нескольких чисел. n == 7 || n == 10 || n == 11 || n > 12
АП
Алексей Пружинин
7 029
Лучший ответ
Алексей Пружинин a четверок и b троек. опечатка
Если тройки и четвёрки обязательное условие, то тогда как-то так...

#include <iostream>
using namespace std;
bool foo(unsigned long long n, const unsigned a = 4U, const unsigned b = 3U) {
while (n > a) {
n -= a;
if (0ULL == n % b) return true;
}
return false;
}
int main() {
unsigned short attempt = 10;
do {
cout << ">>> ";
unsigned long long n;
cin >> n;
cout << (foo(n) ? "Yes" : "No") << "!\n";
} while (--attempt);
system("pause");
}

А если тройки и/или четвёрки, то условие будет выполняться для любых N > 5, где N – множество натуральных чисел.
Сергей Романов
Сергей Романов
52 395
Должны быть обязательно и тройки и четвёрки? Годится, если будут только тройки или только четвёрки?
Valeh Rehimov проверку на остатки от деления сделать? нет канеш