您的位置:首页 > 编程语言 > C语言/C++

24点问题(C语言)

2019-01-28 20:52 204 查看

自己写的关于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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: