Задание: В написанном выражении ((((1?2)?3)?4)?5)?6 вместо каждого знака? вставить знак одной из 4 арифметических операций +,-*,/ так, чтобы результат вычислений равнялся 35(при делении дробная часть в частном отбрасывается.) Найти все решения.
Бьюсь уже пятый час, надо решить без лишних конструкций и библиотек никаких string и прочего. Желательно через массивы и циклы. Пожалуйста помогите)
C/C++
Задача на C++ срочно
void f(int left = 1, int level = 0) {
static char res[] = "((((1?2)?3)?4)?5)?6\n";
if (level > 4) {
if (left == 35) { cout << res; }
return;
}
res[5 + level * 3] = '+'; f(left + (level + 2), level + 1);
res[5 + level * 3] = '-'; f(left - (level + 2), level + 1);
res[5 + level * 3] = '*'; f(left * (level + 2), level + 1);
res[5 + level * 3] = '/'; f(left / (level + 2), level + 1);
}
int main() {
f();
return 0;
}
static char res[] = "((((1?2)?3)?4)?5)?6\n";
if (level > 4) {
if (left == 35) { cout << res; }
return;
}
res[5 + level * 3] = '+'; f(left + (level + 2), level + 1);
res[5 + level * 3] = '-'; f(left - (level + 2), level + 1);
res[5 + level * 3] = '*'; f(left * (level + 2), level + 1);
res[5 + level * 3] = '/'; f(left / (level + 2), level + 1);
}
int main() {
f();
return 0;
}
#include <iostream>
using namespace std;
int f(int x, int y, int operation)
{
switch (operation)
{
case 0: return x + y;
case 1: return x - y;
case 2: return x * y;
case 3: return x / y;
}
}
void g(int operation)
{
switch (operation)
{
case 0: cout << '+'; break;
case 1: cout << '-'; break;
case 2: cout << '*'; break;
case 3: cout << '/'; break;
}
}
int main()
{
int a, b, c, d, e;
for (a = 0; a < 4; a++)
for (b = 0; b < 4; b++)
for (c = 0; c < 4; c++)
for (d = 0; d < 4; d++)
for (e = 0; e < 4; e++)
if (f(f(f(f(f(1, 2, a), 3, b), 4, c), 5, d), 6, e) == 35)
{ cout << "((((1";
g(a);
cout << "2)";
g(b);
cout << "3)";
g(c);
cout << "4)";
g(d);
cout << "5)";
g(e);
cout << '6' << endl;
}
system("pause > nul");
}
Получаются три комбинации:

using namespace std;
int f(int x, int y, int operation)
{
switch (operation)
{
case 0: return x + y;
case 1: return x - y;
case 2: return x * y;
case 3: return x / y;
}
}
void g(int operation)
{
switch (operation)
{
case 0: cout << '+'; break;
case 1: cout << '-'; break;
case 2: cout << '*'; break;
case 3: cout << '/'; break;
}
}
int main()
{
int a, b, c, d, e;
for (a = 0; a < 4; a++)
for (b = 0; b < 4; b++)
for (c = 0; c < 4; c++)
for (d = 0; d < 4; d++)
for (e = 0; e < 4; e++)
if (f(f(f(f(f(1, 2, a), 3, b), 4, c), 5, d), 6, e) == 35)
{ cout << "((((1";
g(a);
cout << "2)";
g(b);
cout << "3)";
g(c);
cout << "4)";
g(d);
cout << "5)";
g(e);
cout << '6' << endl;
}
system("pause > nul");
}
Получаются три комбинации:

Сергей Вдовица
Спасибо!
Сергей Вдовица
А эту задачу реально оформить в рамках одной главной функции main?
(1+2)*3+(4*5+6)=35
char res[] = "((((1?2)?3)?4)?5)?6\n";
int val[6];
for (int i = 0; i < 1024; ++i) {
val[0] = 1;
for (int j = 0, k = i; j < 5; ++j, k >>= 2) {
switch(k & 3) {
case 0: res[5 + j * 3] = '+'; val[j + 1] = val[j] + (j + 2); break;
case 1: res[5 + j * 3] = '-'; val[j + 1] = val[j] - (j + 2); break;
case 2: res[5 + j * 3] = '*'; val[j + 1] = val[j] * (j + 2); break;
case 3: res[5 + j * 3] = '/'; val[j + 1] = val[j] / (j + 2); break;
}
}
if (val[5] == 35) { cout << res; }
}