Другие языки программирования и технологии
Алгоритм поиска на C++
Не первый раз сталкиваюсь с задачами по типу "есть число, необходимо определить можно ли его разбить на тройки и четверки (пример 10 = 3+3+4)", я так поимаю тут нужен особый алгоритм, где про это почитать ну или что гуглить хоть
вряд ли про такое пишут книги, но догадаться можно и самому
если достаточно, чтобы в разбиении были только тройки или только четверки
то тут критерий простой - любое число > 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
если достаточно, чтобы в разбиении были только тройки или только четверки
то тут критерий простой - любое число > 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
Алексей Пружинин
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 – множество натуральных чисел.
#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 – множество натуральных чисел.
Должны быть обязательно и тройки и четвёрки? Годится, если будут только тройки или только четвёрки?
Valeh Rehimov
проверку на остатки от деления сделать? нет канеш
Похожие вопросы
- В корзине лежит 20 яблок. Напишите алгоритм поиска наибольшего по размеру яблока.
- Бинарные деревья в алгоритме поиска слов
- [C++] Сложный алгоритм :(
- Говорят что готовые алгоритмы сортировок и поиска мало эффективны и не пригодны в использовании
- Алгоритмы стандартной библиотеки шаблонов. Вектора в C++.
- C# C++ Как сделать, чтобы при появлении форма раскручивалась в центре экрана.(подскажите алгоритм)
- Алгоритм цикла с неизвестным числом повторений. C++.
- Почему программирование на первый взгляд такое сложное? Потому что многие не умеют составлять алгоритмы?
- Нужно ли быть очень сильным математиком и хорошо уметь конструировать алгоритмы на позиции Software Engineer?
- алгоритм... по нахождению общих элементов двух массивов