欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

24点问题(C语言)

程序员文章站 2022-03-31 20:44:25
...

自己写的关于24点问题求解问题的C语言程序,有重复,有遗漏,程序有待更新。

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
/*
     程序要解决的问题:24点问题求解(就是给你四个数,这四个数取值范围是1-13,经过合适的运算算出24)
     程序缺陷:1、有重复
              2、有遗漏
*/

char show_sign(int m)
{
    if (m==0) return '+';
    if (m==1) return '-';
    if (m==2) return '*';
    if (m==3) return '/';
}

void exchange (double *a,double *b)
{
    double temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

/*
     函数目的:实现size+1个数的加减乘除运算(仅限不带括号的情况)
     函数参数:int *sign 一维数组表示运算符:0~+,1~-,2~*,3~/ 包含三个元素,分别表示为第一、第二、第三位后面的运算符,如1+2-3*4,则sign[0]=0,sign[1]=1,sign[2]=3;
               double *p 一维数组表示传进去的四个数,如若要计算 1+2-3*4,则p[0]=1,p[1]=2,p[2]=3,p[3]=4;
               int size  表示运算符的数量
     函数返回值:这size+1个数经过运算后的的结果
*/
double None_KuoHao(int *sign,double *p,int size)
{
    double result;
    double Input[4];
    int i;
    int index=0,flag=0;
    for (i=0;i<4;i++)
    {
        Input[i]=p[i];
    }
    for (i=0;i<size;i++)
    {
        if (sign[i]==2&&flag==1) Input[index]*=Input[i+1];
        if (sign[i]==3&&flag==1) Input[index]/=Input[i+1];
        if (sign[i]==2&&flag==0) {index=i;flag=1;Input[index]*=Input[i+1];}
        if (sign[i]==3&&flag==0) index=i,flag=1,Input[index]/=Input[i+1];
        if (sign[i]<2) flag=0;
    }
    for(i=0;i<size;i++)
    {
        if(i==0) result=Input[0];
        if (sign[i]==0) result+=Input[i+1];
        if (sign[i]==1) result-=Input[i+1];
    }
    return result;
}
/*
函数目的:进行(a#b#c)#d形式运算(#代表运算符)
函数参数:一个double型数组p1,里面存储着四个数abcd
        一个int型数组sign,代表运算符,0~+,1~-,2~*,3~/
 函数返回值:四个数经过运算后若与24相等,返回1
            若不相等返回0
*/
int Kuohao1(double *p1,int *sign)
{
    double *p;
    int i;
    p=(double*)malloc(sizeof(double)*4);
    for (i=0;i<4;i++)
    {
        p[i]=p1[i];
    }
    for (i=0;i<2;i++)
    {
        if (sign[i]==0) p[0]+=p[i+1];
        if (sign[i]==1) p[0]-=p[i+1];
    }
    if (sign[i]==2) p[0]*=p[i+1];
    if (sign[i]==3) p[0]/=p[i+1];
    if (fabs(p[0]-24.0)<0.0001) {free(p);return 1;}
    else {free(p);return 0;}
}
/*
函数目的:进行(a#b)#(c#d)形式运算(#代表运算符)
函数参数:一个double型数组p2,里面存储着四个数abcd
        一个int型数组sign,代表运算符,0~+,1~-,2~*,3~/
 函数返回值:四个数经过运算后若与24相等,返回1
            若不相等返回0
 */
int Kuohao2(double *p2,int *sign)
{
    double *p;
    int i;
    p=(double*)malloc(sizeof(double)*4);
    for (i=0;i<4;i++)
    {
        p[i]=p2[i];
    }
    if(sign[0]==0) p[0]+=p[1];
    if(sign[0]==1) p[0]-=p[1];
    if(sign[2]==0) p[2]+=p[3];
    if(sign[2]==1) p[2]-=p[3];
    if (p[2]==0)                              //除数不能是0
    {
    	free(p);
    	return 0;
    }
    if (sign[1]==2) p[0]*=p[2];
    if (sign[1]==3) p[0]/=p[2];
    if (fabs(p[0]-24.0)<0.0001) {free(p);return 1;}
    else {free(p);return 0;}
}
/*
函数目的:进行(a#b)#c#d形式运算(#代表运算符)
函数参数:一个double型数组p3,里面存储着四个数abcd
        一个int型数组sign,代表运算符,0~+,1~-,2~*,3~/
 函数返回值:四个数经过运算后若与24相等,返回1
            若不相等返回0
 */
int Kuohao3(double *p3,int *sign)
{
    double *p;
    p=(double*)malloc(sizeof(double)*4);
    int i;
    for (i=0;i<4;i++)
    {
        p[i]=p3[i];
    }
    if(sign[0]==0) p[0]+=p[1],p[1]=p[0];
    if(sign[0]==1) p[0]-=p[1],p[1]=p[0];
    if (fabs(None_KuoHao(sign+1,p+1,2)-24.0)<0.0001)
     {
     	free(p);
     	return 1;
     }
    else
     {	
     	free(p);
     	return 0;
     }
}
/*
函数目的:进行a#(b#c)#d形式运算(#代表运算符)
函数参数:一个double型数组p1,里面存储着四个数abcd
        一个int型数组sign,代表运算符,0~+,1~-,2~*,3~/
 函数返回值:四个数经过运算后若与24相等,返回1
            若不相等返回0
 */
int Kuohao4(double *p4,int *sign1)
{
    double *p;
    p=(double*)malloc(sizeof(double)*4);
    int *sign=(int*)malloc(sizeof (int)*3);
    int i;
    for (i=0;i<4;i++)
    {
        p[i]=p4[i];
    }
    for (i=0;i<3;i++)
    {
        sign[i]=sign1[i];
    }
    if(sign[1]==0) p[1]+=p[2],p[2]=p[3];
    if(sign[1]==1) p[1]-=p[2],p[2]=p[3];
    sign[1]=sign[2];
    if (p[1]==0&&sign[0]=3)                     //除数不能是0
    {
    	free(p),free(sign);
     	return 0;
     }
    if (fabs(None_KuoHao(sign,p,2)-24.0)<0.0001) 
    {
    	free(p),free(sign);
    	return 1;
    }
    else
     {
     	free(p),free(sign);
     	return 0;
     }
}
/*
      函数目的:将输入的四个数进行全排列,并且计算每一种排列经过运算后的结果,若为24将其打印出来
      函数参数:double *p 表示传入的几个数
                int m    对后面m个元素进行全排
                int size 表示进行全排数字的个数
     返回值:  无
*/

void quanpai(double *p,int m,int size)
{
    int i,j,count=0;
    double result=0;
    int sign[4];
    if(m==1)
    {
        for (j=0;j<64;j++)              //表示符号所有情况
        {
            sign[0]=j%4;
            sign[1]=(j/4)%4;
            sign[2]=(j/4/4)%4;
            result=None_KuoHao(sign,p,size-1);
            if (fabs(result-24.0)<0.0001)
            {
                printf("%.0lf%c%.0lf%c%.0lf%c%.0lf=24\n",p[0],show_sign(sign[0]),p[1],show_sign(sign[1]),p[2],show_sign(sign[2]),p[3]);
            }
        }
        for(j=0;j<8;j++)                
        {
            sign[0]=j%2;
            sign[1]=j/2%2+2;                
            sign[2]=j/2/2%2;
            if (Kuohao2(p,sign)==1) printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)=24\n",p[0],show_sign(sign[0]),p[1],show_sign(sign[1]),p[2],show_sign(sign[2]),p[3]);
        }
        for(j=0;j<8;j++)
        {
            sign[0]=j%2;
            sign[1]=j/2%2;
            sign[2]=j/2/2%2+2;
            if (Kuohao1(p,sign)==1) printf("(%.0lf%c%.0lf%c%.0lf)%c%.0lf=24\n",p[0],show_sign(sign[0]),p[1],show_sign(sign[1]),p[2],show_sign(sign[2]),p[3]);
        }
        for(j=0;j<16;j++)
        {
            sign[0]=j%2;
            sign[1]=j/2%2+2;
            sign[2]=j/2/2%4;
            if (Kuohao3(p,sign)==1) printf("(%.0lf%c%.0lf)%c%.0lf%c%.0lf=24\n",p[0],show_sign(sign[0]),p[1],show_sign(sign[1]),p[2],show_sign(sign[2]),p[3]);
        }
        for (j=0;j<8;j++)
        {
            sign[0]=3;
            sign[1]=j%2;
            sign[2]=j/2%4;
            if (Kuohao4(p,sign)==1) printf("%.0lf%c(%.0lf%c%.0lf)%c%.0lf=24\n",p[0],show_sign(sign[0]),p[1],show_sign(sign[1]),p[2],show_sign(sign[2]),p[3]);
        }
    }
    else{
        for(i=size-m;i<size;i++)
        {
            exchange(&p[size-m],&p[i]);
            quanpai(p,m-1,size);
            exchange(&p[size-m],&p[i]);
        }
    }
}

double *input(void)
{
    int i;
    double *p=(double *)malloc(sizeof (double)*4);
    for(i=0;i<4;i++)
        scanf("%lf",&p[i]);
    return p;
}

int main()
{
     double *p;
     int sign[3];
     int m;
     while(1){
     printf("please input four number:");
     p=input();
     quanpai(p,4,4);
     printf("do you want try again? Yes:1 No:0");
     scanf("%d",&m);
     if (m==0) break;
     }
}

相关标签: 24点 C语言