//闲来无事,练练手
#include <stdlib.h>
#include <iostream>
#include <vector>
using namespace std;
#define NUMB_ASCII_V 48
char result[7] = { 0 };
char ops[4] = { '+','-','*','/' };
bool flag = false;
bool revs = false;
char num2str(int num)
{
char res = '+';
switch (num)
{
case 0:
res = '+';
break;
case 1:
res = '-';
break;
case 2:
res = '*';
break;
case 3:
res = '/';
break;
case 4:
res = '(';
break;
case 5:
res = ')';
break;
}
return res;
}
int calOP(float a, float b, float *res)
{
float * tmp = res;
tmp[0] = a + b;
tmp[1] = a - b;
tmp[2] = a * b;
tmp[3] = a / b;
return 1;
}
void sw(float * a, int len)
{
//for (int i = 0; i < len; i++)
//{
// printf("%f\t",a[i]);
//}
//printf("\n");
}
void swres()
{
char tmp[100] = { 0 };
int index = 50;
int index2 = 49;
for (int i = 0; i < 7; i++)
{
if (!(result[i] >= '0' && result[i] <= 'k'))
{
if ((result[i-1] >= '0' && result[i-1] <= 'k') && (result[i - 2] >= '0' && result[i - 2] <= 'k'))
{
tmp[index++] = '(';
tmp[index++] = result[i - 2];
tmp[index++] = result[i];
tmp[index++] = result[i - 1];
tmp[index++] = ')';
}
else if (result[i - 1] >= '0' && result[i - 1] <= 'k')
{
if (revs)
{
tmp[index2--] = result[i];
tmp[index2--] = result[i - 1];
tmp[index2--] = '(';
tmp[index++] = ')';
}
else
{
tmp[index2--] = '(';
tmp[index++] = result[i];
tmp[index++] = result[i - 1];
tmp[index++] = ')';
}
}
else
{
}
}
else
{
continue;
}
}
for (int k = index2 +1 ;k < index;k++)
{
printf("%c", tmp[k]);
}
printf("\n");
}
void midCal(const float *a,int len,int fir,int sec,float b,float *c)
{
float *tmp= c;
tmp[0] = b;
int index = 1;
for (int i = 0; i < len; i++)
{
if (i == fir || i == sec)
continue;
tmp[index++] = a[i];
}
}
void calD2(float *a, int len)
{
float tmp[4] = { 0 };
for (int i = 0; i < len; i++)
{
for (int j = 0;j < len;j++)
{
if (i == j)
continue;
if (!flag)
{
if (i == 0)
{
result[5] = a[j] + NUMB_ASCII_V;
revs = false;
}
else if (j == 0)
{
result[5] = a[i] + NUMB_ASCII_V;
revs = true;
}
}
int reg = calOP(a[i], a[j], tmp);
if (reg == 0)
continue;
sw(tmp, 4);
for (int k = 0; k < 4; k++)
{
result[6] = ops[k];
if (tmp[k] == 24.0000 )
{
printf("@@@@@@@ ok \n");
swres();
}
}
}
}
}
void calD3(const float *a, int len)
{
float tmp[4] = {0};
float tmp2[2] = {0};
for (int i = 0; i < len; i++)
{
for (int j = 0;j < len;j++)
{
if (i == j)
continue;
if (i == 0)
{
result[3] = a[j] + NUMB_ASCII_V;
flag = false;
revs = false;
}
else if(j == 0)
{
result[3] = a[i] + NUMB_ASCII_V;
flag = false;
revs = true;
}
else
{
result[3] = a[i] + NUMB_ASCII_V;
result[4] = a[j] + NUMB_ASCII_V;
flag = true;
revs = false;
}
int reg = calOP(a[i], a[j], tmp);
if (reg == 0)
continue;
for (int k = 0; k < 4; k++)
{
midCal(a, len, i, j, tmp[k],tmp2);
sw(tmp2,len -1);
if (flag)
{
result[5] = ops[k];
}
else
{
result[4] = ops[k];
}
calD2(tmp2, len - 1);
}
}
}
}
void calD4(const float *a,int len)
{
float tmp[4] = { 0 };
float tmp2[3] = { 0 };
for (int i = 0; i < len; i++)
{
for (int j = 0;j < len;j++)
{
if (i == j)
continue;
result[0] = a[i] + NUMB_ASCII_V;
result[1] = a[j] + NUMB_ASCII_V;
int reg = calOP(a[i], a[j], tmp);
if (reg == 0)
continue;
for (int k = 0; k < 4; k++)
{
midCal(a, len, i, j, tmp[k], tmp2);
sw(tmp2, len - 1);
result[2] = ops[k];
calD3(tmp2, len - 1);
}
}
}
}
int main(int num, char * str)
{
float a[4] = {4,4,2,1};
calD4(a,4);
system("pause");
return 0;
}
输出:全部结果