转载乌鸦丘比特 的24点程序
转载此帖的目的在于加强原创发表的技术性 提高大家参与的积极性 另外也可以使大家学习学习乌鸦丘比特这个程序的算法 大家共同进步么
如果谁要与他联系 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编辑过]