转载此帖的目的在于加强原创发表的技术性 提高大家参与的积极性 另外也可以使大家学习学习乌鸦丘比特这个程序的算法 大家共同进步么
如果谁要与他联系 crow2727@163.com 这个是他的email
[原创]较完善24点程序 24点的程序很多。除法一直是个头疼的问题。 我想出了一个半法用来解决除法: 定义work()函数————下面 算法:把每个整数看成分数,如4=4/1; work()是基于分数运算的函数,具体做法是分子分母分开运算; 如5/4+2/3=(5*3+2*4)/4*3 不做约分处理,假设结果为A/B则可用if(A==24*B)来判断; 可能情况除(a?b)?c?)d与(a?b)?(c?d)之外 还应该包含(a/(b?c))?d,(a-(b?c))?d;a/((b?c)?d);a/(b?(c?d)); 本代码可计算一些中间过程有分数出现的可能
代码如下:(很乱,没耐心不看没事的,知道算法就可以了 ) int work(int a,int b,int *c,int *d,int e) /*work ()为计算函数,a为第一个数的分子,*c为分子,b,*c同理*/ {int s; /* e为计算符号。1代表+,2代表-,3代表*,4代表*/ switch(e) /*work()返回计算结果分子,分母由指针*c返回*/ {case 1:s=(*d)*a+(*c)*b;*c=(*c)*(*d);break; case 2:s=(*d)*a-(*c)*b;*c=(*c)*(*d);break; case 3:s=a*b;*c=(*c)*(*d);break; case 4:s=a*(*d);*c=(*c)*b;break; } return s;} main() {int a[5],j,card[5],i1,i2,i3,i4,e[5],answer,count=0,aw1,aw2,n[5],yes=1,m=1,x; int *c;int *d;int *f;int *g; char get; while(yes) { a[1]=0; a[2]=0;a[3]=0;a[4]=0; printf("请输入数字:\n"); scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4]); if(!(a[1]&&a[2]&&a[3]&&a[4])){printf("输入无效\n");continue;} for(i1=1;i1<=4;i1++) for(i2=1;i2<=4;i2++) {if(i1==i2)continue; for(i3=1;i3<=4;i3++) {if(i3==i2||i3==i1)continue; for(i4=1;i4<=4;i4++) {if(i4==i3||i4==i2||i4==i1)continue; /*洗牌,穷举所有顺序*/ card[1]=a[i1]; card[2]=a[i2]; card[3]=a[i3]; card[4]=a[i4]; for(e[1]=1;e[1]<=4;e[1]++) for(e[2]=1;e[2]<=4;e[2]++) { for(e[3]=1;e[3]<=4;e[3]++) /*穷举所有符号*/ {*c=1; *d=1; *f=1; *g=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算((a?b)?c)?d*/ answer=work(answer,card[3],c,d,e[2]); if(!(*c))m=0; answer=work(answer,card[4],c,d,e[3]);if(!(*c))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=3;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("((%d%c%d)%c%d)%c%d=24\n",card[1],n[1],card[2],n[2],card[3],n[3],card[4]);getch(); count++;} *c=1; m=1; aw1=work(card[1],card[2],c,d,e[1]); if(!(*c))m=0; /*计算(a?b)?(c?d)*/ aw2=work(card[3],card[4],f,g,e[2]); if(!(*f))m=0; answer=work(aw1,aw2,c,f,e[3]); if(!(*c))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=3;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("(%d%c%d)%c(%d%c%d)=24\n",card[1],n[1],card[2],n[3],card[3],n[2],card[4]);getch(); count++;}
} x=4;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算a/((b?c)?d)*/ answer=work(answer,card[3],c,d,e[2]); if(!(*c))m=0;*c=1; answer=work(card[4],answer,d,c,x);if(!(*d))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("%d/((%d%c%d)%c%d)=24\n",card[4],card[1],n[1],card[2],n[2],card[3]);getch(); count++;} m=1;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算a/(b?(c?d))*/ answer=work(card[3],answer,d,c,e[2]); if(!(*d))m=0; *c=1; answer=work(card[4],answer,c,d,x);if(!(*c))m=0; if((answer==((*c)*24))&&m) {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }} printf("%d/(%d%c(%d%c%d))=24\n",card[4],card[3],n[2],card[1],n[1],card[2]);getch(); count++;
}m=1;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; /*计算(a-(b?c))?d*/ answer=work(card[3],answer,d,c,2);if(!(*d))m=0; *c=1; answer=work(answer,card[4],d,c,e[2]); if(!(*d))m=0;
if((answer==((*d)*24))&&m) {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }}printf("(%d-(%d%c%d))%c%d=24\n",card[3],card[1],n[1],card[2],n[2],card[4]);getch(); count++;} m=1;*c=1;*d=1; answer=work(card[1],card[2],c,d,e[1]);if(!(*c))m=0; answer=work(card[3],answer,d,c,4);if(!(*d))m=0; *c=1; answer=work(answer,card[4],d,c,e[2]); if(!(*d))m=0;
if((answer==((*d)*24))&&m) /*计算(a/(b?c))?d*/ {for(j=1;j<=2;j++) {switch(e[j]) {case 1:n[j]='+';break; case 2:n[j]='-';break; case 3:n[j]='*';break; case 4:n[j]='/';break; }}printf("(%d/(%d%c%d))%c%d=24\n",card[3],card[1],n[1],card[2],n[2],card[4]);getch(); count++;}
}
}}}if(!count)printf("对不起,无解\n");count=0;}}
[此贴子已经被作者于2004-07-20 12:13:23编辑过]