C语言版的算24游戏代码

给定4个1-9之间的数,通过加减乘除四则运算算出24来,可以使用括号

#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;
}

编程技巧