계산하다

4272 단어
#include<stdio.h>

#include<stdlib.h>

#include<string.h>



#define OK 1

#define ERROR 0



char sz[8]=" +-*/";

int list[25][5],map[5][5],visit[5],t,pp[5];



char z[400];



double two(double a,int f,double b)

{

    switch(f)

    {

    case 1:

        {

            return a+b;

            break;

        }

    case 2:

        {

            return a-b;

            break;

        }

    case 3:

        {

            return a*b;

            break;

        }

    case 4:

        {

            return a/b;

            break;

        }



    }

    

}



int pan(char *x,double a,double b,double c,int f1,int f2)

{

    //printf("%s a = %.0lf  b= %.0lf  c= %.0lf %c   %c/n",x,a,b,c,sz[f1],sz[f2]);

    double xy=two(a,f1,two(b,f2,c));

    //printf("---%.0lf/n",xy);

    if(24.0==xy)

    {

        //printf("ppp %.0lf/n",DIAN);

        sprintf(z,"%s%c(%.0lf%c%.0lf)",x,sz[f1],b,sz[f2],c);

        return 1;

    }

    else

        return 0;

    

}

int four(double *a,int *f)//3   

{

    char x[200],y[200];

    double b[3],hou[2];





    //if(f[0]==1||f[0]==2)

    {

        sprintf(x,"(%.0lf%c%.0lf)",a[0],sz[f[0]],a[1]);

        

    }



    b[0]=two(a[0],f[0],a[1]);

    if(b[0]<0)

    {

        b[0]=-b[0];

        sprintf(x,"(%.0lf%c%.0lf)",a[1],sz[f[0]],a[0]);

    }

    //if(f[1]==1||f[1]==2)

    {

        sprintf(y,"(%s%c%.0lf)",x,sz[f[1]],a[2]);

    }



    b[1]=two(b[0],f[1],a[2]);

//    printf("%.0lf  %s",b[1],y);

    

    if(b[1]<0)

    {

        b[1]=-b[1];

        sprintf(y,"(%.0lf%c%s)",a[2],sz[f[1]],x);

    }





//    if(f[2]==1||f[2]==2)

    {

        sprintf(z,"(%s%c%.0lf)",y,sz[f[2]],a[3]);

    }

    b[2]=two(b[1],f[2],a[3]);

    if(b[2]<0)

    {

        b[2]=-b[2];

        sprintf(z,"(%.0lf%c%s)",a[3],sz[f[2]],y);

    }

    //printf("-----%.0lf----/n",b[2]);



    if(b[2]==24.0)

    {

    //printf("xxx");

        

        

        return OK;

    }

    else

    {

        if(pan(x,b[0],a[2],a[3],f[1],f[2]))

        {

            return OK;

            

        }

        else

            return ERROR;

    }



    

    

}



void cal(int r,int j)

{

    if(r<4)

    {

        for(int i=0;i<4;i++)

        {

            

            if(!visit[i])

            {//printf("11111");

                visit[i]=1;

                pp[j]=map[r][i];

                cal(r+1,j+1);

                visit[i]=0;

            }

        }

    }

    else

    {

        for(int k=0;k<4;k++)

            list[t][k]=pp[k];

        t++;

    }

    

}





int main()

{

    

    int a,b,c,d,ttt=0;

    int i,j,k,l,kt,flag;

    int ft[3];

    double at[4];

    while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)

    {

        ttt++;

    

        t=0;

        flag=1;

        

        for( i=0;i<4;i++)

        {

            map[i][0]=a;

            map[i][1]=b;

            map[i][2]=c;

            map[i][3]=d;

        }

        cal(0,0);

    //    printf("t = %d/n",t);

printf("Case %d:/n",ttt);

        /*

        for(i=0;i<24;i++)

        {

            for(j=0;j<4;j++)

                printf("%d ",list[i][j]);

            printf("/n");

        }



system("pause");*/

        for(i=0;i<t&&flag;i++)

        {for(kt=0;kt<4;kt++)

                at[kt]=list[i][kt];

            for(j=1;j<=4&&flag;j++)

                for(k=1;k<=4&&flag;k++)

                    for(l=1;l<=4&&flag;l++)

                    {

                        

                        ft[0]=j;ft[1]=k;ft[2]=l;

                        if(four(at,ft))

                        {

                            

                            printf("%s/n",z);

                            flag=0;

                            break;

                        }

                    }

            

        }

        if(flag)

        {



            printf("No Solution!/n");

        }







    }





    return 0;

}


좋은 웹페이지 즐겨찾기