- include <stdio.h>
int oper(double x, double y, int op, double *res)
{
switch (op)
{
case 0 :
*res = x + y;
return(1);
case 1 :
*res = (x > y) ? (x - y) : (y - x);
return(1);
case 2 :
*res = x * y;
return(1);
case 3 :
if (y == 0)
return(0);
*res = x / y;
return(1);
case 4 :
if (x == 0)
return(0);
*res = y / x;
return(1);
default :
return(0);
}
}
int calculer(double *nombres,
int i1, int j1, int op1,
int i2, int j2, int op2,
int i3, int j3, int op3)
{
double calculs[4];
int i, valid = 1;
int ti[3], tj[3], top[3];
ti[0] = i1;
tj[0] = j1;
top[0] = op1;
ti[1] = i2;
tj[1] = j2;
top[1] = op2;
ti[2] = i3;
tj[2] = j3;
top[2] = op3;
for (i = 0; i < 4; i++)
calculs[i] = nombres[i];
for (i = 0; i < 3 && valid; i++)
{
valid = oper(calculs[ti[i]],calculs[tj[i]],top[i],calculs + ti[i]);
calculs[tj[i]] = calculs[3-i];
}
return(valid && calculs[0] == 24);
}
void afficher(double *nombres,
int i1, int j1, int op1,
int i2, int j2, int op2,
int i3, int j3, int op3)
{
double vtemp;
int i;
int ti[3], tj[3], top[3];
ti[0] = i1;
tj[0] = j1;
top[0] = op1;
ti[1] = i2;
tj[1] = j2;
top[1] = op2;
ti[2] = i3;
tj[2] = j3;
top[2] = op3;
for (i = 0; i < 3; i++)
{
oper(nombres[ti[i]],nombres[tj[i]],top[i],&vtemp);
switch (top[i])
{
case 0 :
printf("%.3f + %.3f = %.3f\n",nombres[ti[i]],nombres[tj[i]],vtemp);
break;
case 1 :
if (nombres[ti[i]] > nombres[tj[i]])
printf("%.3f - %.3f = %.3f\n",nombres[ti[i]],nombres[tj[i]],vtemp);
else
printf("%.3f - %.3f = %.3f\n",nombres[tj[i]],nombres[ti[i]],vtemp);
break;
case 2 :
printf("%.3f * %.3f = %.3f\n",nombres[ti[i]],nombres[tj[i]],vtemp);
break;
case 3 :
printf("%.3f / %.3f = %.3f\n",nombres[ti[i]],nombres[tj[i]],vtemp);
break;
case 4 :
printf("%.3f / %.3f = %.3f\n",nombres[tj[i]],nombres[ti[i]],vtemp);
break;
}
nombres[ti[i]] = vtemp;
nombres[tj[i]] = nombres[3-i];
}
}
int main (int argc, char *argv[])
{
double nombres[4] = {1.0,3.0,4.0,6.0};
int i1, j1, op1, i2, j2, op2, op3;
int trv = 0;
for (i1 = 0; i1 < 3 && !t rv; i1++)
for (j1 = i1+1; j1 < 4 && !t rv; j1++)
for (op1 = 0; op1 < 5 && !t rv; op1++)
for (i2 = 0; i2 < 2 && !t rv; i2++)
for (j2 = i2+1; j2 < 3 && !t rv; j2++)
for (op2 = 0; op2 < 5 && !t rv; op2++)
for (op3 = 0; op3 < 5 && !t rv; op3++)
if ((trv = calculer(nombres,i1,j1,op1,i2,j2,op2,0,1,op3)))
afficher(nombres,i1,j1,op1,i2,j2,op2,0,1,op3);
if (!trv)
printf("Non trouve !" );
return(1);
}
Ce petit prog me donne la solution suivante :
3.000 / 4.000 = 0.750
1.000 - 0.750 = 0.250
6.000 / 0.250 = 24.000
C power !