C/C++

Задача на с++ связанная с расстановкой знаков

В выражении ((((1? 2) ? 3) ? 4) ? 5) ? 6 вместо каждого знака? поставить знак одной из операций +, -*, / так, чтобы результат вычислений был равен 35.
Вообщем что сделал я, я написал программу просто перебирающую комбинации. Но мне нужно подсчитывать результат и выводить соответствующую ему комбинацию. Проблема в том, что нельзя использовать никакие библиотеки связанные со строками такие как стринг и прочие. Условия можно и массивы. Это реально как то сделать через массивы?
А также все должно быть внутри функции main

#include
using namespace std;
int main()
{
char mas1[4]{'/','+','-','*'};
char mas2[4]{'/','+','-','*'};
char mas3[4]{'/','+','-','*'};
char mas4[4]{'/','+','-','*'};
char mas5[4]{'/','+','-','*'};
for (int a=0; a<4; a++)
{
for (int b=0; b<4; b++)
{
for (int c=0; c<4; c++)
{
for (int d=0; d<4; d++)
{
for (int e=0; e<4; e++)
{
cout<<"((((1";
cout<<mas1[a];
cout<<"2)";
cout<<mas2[b];
cout<<"3)";
cout<<mas3[c];
cout<<"4)";
cout<<mas4[d];
cout<<"5)";
cout<<mas5[e];
cout<<"6";
cout<<endl;
}
}
}
}
}
}
Я же тебе в комментариях к своему рекурсивному ответу уже предлагал решение с массивами, циклами и только main:

int main() {
char res[] = "((((1?2)?3)?4)?5)?6\n";
int val[6] = {1};
for (int i = 0; i < 1024; ++i) {
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; }
}
}

Если делать по твоему шаблону и без функций, то получится крайне громоздко. Что-то вроде такого:

int main() {
char mas[4] { '+','-','*','/' } ;
int res[5];
for (int a=0; a<4; a++) {
switch (mas[a]) {
case '+': res[0] = 1 + 2; break;
case '-': res[0] = 1 - 2; break;
case '*': res[0] = 1 * 2; break;
case '/': res[0] = 1 / 2; break;
}
for (int b=0; b<4; b++) {
switch (mas[b]) {
case '+': res[1] = res[0] + 3; break;
case '-': res[1] = res[0] - 3; break;
case '*': res[1] = res[0] * 3; break;
case '/': res[1] = res[0] / 3; break;
}
for (int c=0; c<4; c++) {
switch (mas[c]) {
case '+': res[2] = res[1] + 4; break;
case '-': res[2] = res[1] - 4; break;
case '*': res[2] = res[1] * 4; break;
case '/': res[2] = res[1] / 4; break;
}
for (int d=0; d<4; d++) {
switch (mas[d]) {
case '+': res[3] = res[2] + 5; break;
case '-': res[3] = res[2] - 5; break;
case '*': res[3] = res[2] * 5; break;
case '/': res[3] = res[2] / 5; break;
}
for (int e=0; e<4; e++) {
switch (mas[e]) {
case '+': res[4] = res[3] + 6; break;
case '-': res[4] = res[3] - 6; break;
case '*': res[4] = res[3] * 6; break;
case '/': res[4] = res[3] / 6; break;
}
if (res[4] == 35) {
cout<<"((((1"<<mas[a]<<"2)"<<mas[b]<<"3)"<<mas[c]<<"4)"<<mas[d]<<"5)"<<mas[e]<<"6"<<endl;
}
}
}
}
}
}
}
ÐÐ
алеðºñÐµð¹ кñƒÐ»Ñ‹Ð³Ð¸ð½
86 217
Лучший ответ
Ramil Mamikov Магия какая-то. До операторов сдвига и побитового "И" еще не дошел в обучении.
В описании написано что & побитно сравнивает два значения и возвращает либо 1 либо 0. А у вас в свиче фактически выходит 0...3, как так?
Ramil Mamikov То есть фактически выводится сумма всех побитных совпадений или каким образом формируется 3?
Ramil Mamikov Ааа... так понятнее. Но конечно побитовые операции это уже высший пилотаж.
#include < iostream >
using namespace std;

void fuu(int **massiv, int number)
{
int result=1; //перая циферь уравнения
for (int var = 0; var < 5; var++)
{
switch (massiv[number][var])
{
case 0: result += (var + 2); break;
case 1: result -= (var + 2); break;
case 2: result *= (var + 2); break;
case 3: result /= (var + 2); break;
}

}
massiv[number][5] = result;
}

int main()
{
int** massiv = new int* [1024]; // массив для хранения всех вариантов
for (int i = 0; i < 1024; i++)
massiv[i] = new int[6]{ 0 }; // 5 элементов для операции и 1 для хранения результата

int i = 0;
for (int j0 = 0; j0 < 4; j0++)
for (int j1 = 0; j1 < 4; j1++)
for (int j2 = 0; j2 < 4; j2++)
for (int j3 = 0; j3 < 4; j3++)
for (int j4 = 0; j4 < 4; j4++)
{
massiv[i][0] = j0;
massiv[i][1] = j1;
massiv[i][2] = j2;
massiv[i][3] = j3;
massiv[i][4] = j4;
i++;
}

for (int i=0; i<1024; i++) fuu(massiv, i);
for (int i = 0; i < 1024; i++)
{
if (massiv[i][5] == 35) cout << massiv[i][0] << " " <<
massiv[i][1] << " " <<
massiv[i][2] << " " <<
massiv[i][3] << " " <<
massiv[i][4] << " " << endl;
}

return 0;
}
Сергей Губин
Сергей Губин
51 411
Сергей Губин Выдает код из 5 разрядов соответствующий нужным знакам, где 0 - плюс, 1 - минус, 2 - умножить, 3 - разделить.
в программе 1024 - число вариаций из 5 знаков по 4 варианта каждый т. е. 4 в пятой степени.