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; } }
相关文章推荐
- 个人对C语言字节对齐问题的一些见解
- 【C语言训练】百钱百鸡问题
- 用C语言实现“百鸡问题”的求解
- 你一定遇到过的C语言内存问题
- C语言常见问题
- C语言,回溯法0-1背包问题
- 2017蓝桥杯C语言B组(7日期问题)
- C语言实现之三角形问题(非动态规划方法)
- 学习c语言遇到的一些问题(1)(Linux)(调用库函数)
- c语言全局变量和局部变量问题汇总
- C语言编程常见问题分析
- c语言牛顿迭代法的问题
- C语言内存分配问题
- c语言main函数的argc和argv[]参数问题
- C语言测试:想成为嵌入式程序员应知道的0x10个基本问题(转)
- 初接触c语言,请大家帮忙看看问题出在哪了!
- 整数划分问题(C语言求解)
- <C语言>结构体与联合体(共用体)的地址排布问题(内存字节对齐)
- 读书笔记之:你必须知道的495个C语言问题
- 0-1背包和背包问题(C语言实现)——贪心算法应用(3)