给定4个1-9之间的数,通过加减乘除四则运算算出24来,可以使用括号
#include "stdafx.h"
#include
#include
double sum(double a,double b)
{
return a+b;
}
double mi(double a,double b)
{
return a-b;
}
double mul(double a,double b)
{
return a*b;
}
double di(double a,double b)
{
return a/b;
}
double (*ops[4])(double a,double b)={sum,mi,mul,di};
double num[4];/*输入的数*/
double num3[4];/*第二次运算时暂时保存*/
double num4[4];/*第一次运算时暂时保存*/
double numf[4];/*输入的数保存输出时候用*/
/*复制数组*/
void copyarr(double *src,double *des)
{
int i;
double t[4];
for(i=0;i<4;i++)
des[i]=src[i];
}
/*第一次计算后,合并为前三个数*/
void reorder4(int cp4,double re4)
{
switch(cp4)
{
case 0:
num[0]=re4;
num[1]=num[2];
num[2]=num[3];
break;
case 1:
num[1]=re4;
num[2]=num[3];
break;
case 2:
num[2]=re4;
break;
}
}
/*第二次计算后,合并为两个数*/
void reorder3(int cp3,double re3)
{
switch(cp3)
{
case 0:
num[0]=re3;
num[1]=num[2];
break;
case 1:
num[1]=re3;
break;
}
}
/*根据运算得到操作符*/
char opc(double(*opt)(double a,double b))
{
if(opt==sum)
return '+';
else if(opt==mi)
return '-';
else if(opt==mul)
return '*';
else if(opt==di)
return '/';
}
/*输出*/
void printresult(double *num,int ta3,int ta4,double(*op2)(double a,double b),double(*op3)(double a,double b),double(*op4)(double a,double b))
{
double n0=num[0];
double n1=num[1];
double n2=num[2];
double n3=num[3];
switch(ta4)
{
case 0:
if(ta3==0)
printf("((%.0f%c%.0f)%c%.0f)%c%.0f\n",n0,opc(op4),n1,opc(op3),n2,opc(op2),n3);
else if(ta3==1)
printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",n0,opc(op4),n1,opc(op2),n2,opc(op3),n3);
break;
case 1:
if(ta3==0)
printf("(%.0f%c(%.0f%c%.0f))%c%.0f\n",n0,opc(op3),n1,opc(op4),n2,opc(op2),n3);
else if(ta3==1)
printf("%.0f%c((%.0f%c%.0f)%c%.0f)\n",n0,opc(op2),n1,opc(op4),n2,opc(op3),n3);
break;
case 2:
if(ta3==0)
printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",n0,opc(op3),n1,opc(op2),n2,opc(op4),n3);
else if(ta3==1)
printf("%.0f%c(%.0f%c(%.0f%c%.0f))\n",n0,opc(op2),n1,opc(op3),n2,opc(op4),n3);
break;
}
}
int main(void)
{
int a,b,c,d;/*输入的数*/
int cp3,cp4;/*cp3,cp4分别是第二次和第一次运算时的两个数运算,前一个数所在的位置*/
int i,j,k;/*循环各种运算*/
double re2,re3,re4;/*第3,2,1次运算的结果*/
double(*cop2)(double a,double b);/*第3次操作符*/
double(*cop3)(double a,double b);/*第2次操作符*/
double(*cop4)(double a,double b);/*第1次操作符*/
scanf("%d%d%d%d",&a,&b,&c,&d);
num[0]=(double)a;
num[1]=(double)b;
num[2]=(double)c;
num[3]=(double)d;
/*每次运算之前备份,运算后合并以供后面的运算,但是如果没有找到解必须恢复备份*/
copyarr(num,numf);
copyarr(num,num4);
for(cp4=0;cp4<=2;cp4++)
{
for(i=0;i<4;i++)
{
cop4=ops[i];
re4=(*cop4)(num[cp4],num[cp4+1]);
reorder4(cp4,re4);
copyarr(num,num3);
for(cp3=0;cp3<=1;cp3++)
{
for(j=0;j<4;j++)
{
cop3=ops[j];
re3=(*cop3)(num[cp3],num[cp3+1]);
reorder3(cp3,re3);
for(k=0;k<4;k++)
{
cop2=ops[k];
re2=(*cop2)(num[0],num[1]);
if(re2==24)
{
printresult(numf,cp3,cp4,cop2,cop3,cop4);
system("pause");
return 0;
}
}
copyarr(num3,num);
}
}
copyarr(num4,num);
}
}
system("pause");
return 0;
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。