- #include "stdafx.h"
- #include <stdio.h>
- #include <stdlib.h>
- 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;
- }
- //该片段来自于http://www.codesnippet.cn/detail/141020136399.html
来源: http://www.codesnippet.cn/detail/141020136399.html